OpenFileDialog und FILE



  • Hallo,
    folgendes Problem:
    Ich hab ein Programm geschrieben, das in der Konsole einen Dateinamen und -Pfad abfragt und die entsprechende Datei zur weiteren Verwendung öffnet.
    Bisherige Version:

    char File1Name[255];
    FILE* File1
    
    printf("Quelldatei...: ");
    scanf("%s", File1Name);
    
    if( (File1  = fopen(File1Name, "r" )) == NULL )
    {
    	printf( "\nFehlgeschlagen!\n" );
    	goto ended;
    }
    

    Funktioniert soweit tadellos und tut anschließend seine Aufgabe.

    Nun wurde der Auftrag allerdings erweitert und ich muss den Dateinamen per Dialogfenster abfragen.
    Bisher folgender Stand:

    OpenFileDialog *openFileDialog1 = new OpenFileDialog();
    FILE *File1;
    char File1Name[255];
    
    if(openFileDialog1->ShowDialog()==::DialogResult::OK)
            [b]//Dieser Abschnitt fehlt[/b]
    
    if( (File1  = fopen(File1Name, "r" )) == NULL )
    {
    	printf( "\nFehlgeschlagen!" );
    	goto ended;
    }
    

    Nun hänge ich seit zwei Tagen an dem fehlenden Stück, das den Dateinamen aus dem OpenFileDialog in den für fopen nötigen char[] umwandelt.

    Hab schon allen möglichen Unsinn durchprobiert. Allerdings ist meine Erfahrung noch sehr klein.
    Wäre sehr dankbar, wenn jemand eine Idee hätte.



  • OpenFileDialog ist auf jedenfall erstmal kein Standard-C++, muss von einer Lib kommen, die mir aber nich geläufig ist 🙂

    meist haben solche Klassen Funktionen wie OpenFileDialog::GetFilename() oder sowas, also du musst das Objekt nach dem ausgewählten Dateionamen fragen. DAnn kannst du weitermachen wie bisher



  • So weit war ich einem der Fehlversuche bereits:

    File1Name = openFileDialog1->get_FileName();
    

    error C2440: '=' : 'System::String __gc *' kann nicht in 'char [255]' konvertiert werden



  • Ein blankes Array kann auch nicht per = zugewiesen werden. Also entweder du verwendest einen Pointer auf die Daten, die dir der Dialog gibt oder du überträgst sie per strcpy() in dein Array.



  • Was dann in Code wie aussähe?

    NACHTRAG:

    strcpy(File1Name, openFileDialog1->get_FileName());
    
    error C2664: 'strcpy' : Konvertierung des Parameters 2 von 'System::String __gc *' in 'const char *' nicht möglich
    


  • Hallo

    du hast immer noch nicht gesagt, mit welcher externen Bibliothel du arbeitest.
    OpenFileDialog ist kein Teil des C++Standards!

    Die Fehlermeldung deutet darauf hin, das die vom Dialog verwendete String-Klasse nicht impliziet in einen C-String umzuwandeln ist. Die meisten String-Klassen bieten dafür Methoden an, die das erledigen. Meistens heißen die c_str().

    Das weiterraten hier kannst du aber nur beenden, wenn du oben genannte Frage beantwortest.

    bis bald
    akari



  • Bittesehr
    http://msdn2.microsoft.com/de-de/library/system.windows.forms.filedialog.aspx

    Wo genau ich die get_FileName Funktion her hab, kann ich ncihtmal sagen. Kann auhc aus den Hilfedateien kommen

    Entwicklungsumgebuing ist Visual C++ mit .NET Framework 1.0
    Jahrgang 2001/2002 scheinbar. Was neueres haben die hier nicht.



  • "System::String __gc*" klingt irgendwie nach einem .NET System.

    *in der MSDN nachschlägt*
    Im Schnelldurchlauf finde ich nur die Methode CopyTo(), die eventuell passen könnte.

    (zum Thema wchar_t -> char findest du nebenan einen Beitrag)



  • error C2664: 'System::String::CopyTo' : Konvertierung des Parameters 2 von 'System::String __gc *' in '__wchar_t __gc[]' nicht möglich

    Das macht mich langsam echt sauer. Den zweiten Tag fummel ich nun schon an dieser einen kleinen Ecke.

    Gibts evtl. ne andere Alternative, um den Nutzer die Datei grafisch wählen zu lassen?



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn Du die MFC verwendest, dann mit CFileDialog. Der ist IMHO Teil der comctl32.ocx (o.ä.? *etwas unsicher*) müsste sich so also auch über ActiveX einbinden lassen.



  • @HumeSikkins: C++/CLI ist zwei Etagen tiefer 😉

    @Paddy: Entweder du verzichtest komplett auf fopen() etc. und nutzt neuere File-Klassen der .NET Umgebung - oder du nimmst einen CFileDialog aus der MFC - dessen GetPathName() Methode liefert einen CString, der eine automatische Konvertierung nach TCHAR* anbietet.



  • EDIT:

    Ok, bin weiter und habs geschafft, den Pfad in die char-Variable einzulesen.

    MailFinder Gold Console -v2 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) bereits in LIBCMTD.lib(dbgdel.obj) definiert

    Zuviele includes, usings whatever?

    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <iostream>
    #include <afxdlgs.h>
    #using <mscorlib.dll>
    #using <system.dll>
    #using <system.windows.forms.dll>
    using namespace std;
    using namespace System::Windows::Forms;
    using namespace System;
    #include "mailfuncts.h"
    

    Das ist das Ergebnis der Experimente mit vorhergehenden Schritten. Ist mit Sicherheit nicht sehr ordentlich.



  • Ok, die Reihenfolge der Einträge machts aus. Wenn ich die <afxdlgs.h> auskommentiere (und natürlich allen Code, der Dinge daraus verwendet), dann läuft er durch.

    Laut Microsoft Hilfeseite kann man über bestimmte Linkereinstellungen eine Verarbeitung in korrekter Reihenfolge erzwingen. Leider beziehen sich die Leute auf eine andere Version und mir fehlt das Dialogfeld dazu. Es belibt also nur umsortieren.

    Vieleicht rettet mich einer davor, alle Kombinationen von Hand durch zu testen.


Log in to reply