In Konsolenbasiertes projekt datei öffnen Dialog implementieren



  • Hallo,
    ich habe ein Konsolenbasiertes Projekt in dem ich bisher eine datei wie folgt oeffne:

    if((eingabe_datei = fopen("test_daten","r")) == NULL)
    	{
    		printf("\nDie Datei test_daten konnte nicht geöffnet werden\n");
    		getch();
    		exit(1);
    	}
    

    da ich oft andere dateien oeffnen muss waere der datei öffne dialog (schoen graphisch wie mit der MFC) schoen.

    nun habe ich bisher mit der MFC noch kaum was zu tun gehabt und moechte wissen wie das ohne grossen aufwand möglich ist.

    Alternativ kann ich ja den dateinamen aus einer "ini" datei einlesen. Aber der datei öffnen dialog wäre schon noch viel praktischer.

    Ansonsten nutzt das Konsolen projet haufig die ausgabe mit printf über die konsole diese sollte weiterhin so funktionieren.

    hat jemand eine Idee oder vorschlag?

    danke gruss tobe



  • Für den Datei-Öffnen Dialog brauchst Du keine MFC, sondern einfach eine WinAPI Funktion aufzurufen...

    Siehe:
    http://msdn2.microsoft.com/en-us/library/ms646829
    =>

    OPENFILENAME ofn;       // common dialog box structure
    char szFile[260];       // buffer for file name
    HWND hwnd;              // owner window
    HANDLE hf;              // file handle
    
    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    //
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    //
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    // Display the Open dialog box. 
    
    if (GetOpenFileName(&ofn)==TRUE) 
        hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
            0, (LPSECURITY_ATTRIBUTES) NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            (HANDLE) NULL);
    


  • vielen danke

    jetztr bekomme ich aber folgende fehlermeldung

    Run-Time Check Failure #3 - The variable 'hwnd' is being used without being defined.

    und da ich ehrlich gesagt nicht alles vom code verstehe fällt es mir schwer dieser auf den grund zu gehn.

    hat jemand ein tipp?

    danke



  • Ersetze

    HWND hwnd;
    

    durch

    HWND hwnd = NULL;
    


  • danke klasse jetzt funktioniert es einwandfrei.

    nur meine dateioeffnen dialog danach

    if((eingabe_datei = fopen(szFile,"r")) == NULL)
    

    kann die ausgewählte datei nicht öffnen.
    das problem ist dass fopen das verzeichnis wie folgt wünscht:

    d:\\test\\test_daten

    die Windows API aber das verzeichnis in dem Array
    szFile so speichert:

    d:\test\test_daten

    gibts da noch eine bessere lösung wie in dem array nach dem schrägstrich suchen und falls vorhanden ein weiterer hinzufügen?

    ich hoffe das ist hierbei das letzte problem.

    danke



  • Nein. Die CRT Funktionen wollen den Pfad nur mit *einem* Slash!
    Du bringst das String-Literale und die representation im Speicher durcheinander...



  • also so bekomme ich keinen fehler und die datei wird geöffnet

    if((eingabe_datei = fopen("d:\\test\\test_daten","r")) == NULL)
    	{
    		printf("\nDie Datei test_daten konnte nicht geöffnet werden\n");
    		getch();
    		exit(1);
    	}
    

    und so bekomme ich die Meldung nDie Datei test_daten konnte nicht geöffnet fopen liefert mir also NULL zurück

    if((eingabe_datei = fopen("d:\test\test_daten","r")) == NULL)
    	{
    		printf("\nDie Datei test_daten konnte nicht geöffnet werden\n");
    		getch();
    		exit(1);
    	}
    

    Ich hab immer gedacht das hängt mit windows zusammen...

    gruss



  • echt sorry
    aber es ist unglaublich.

    die Datei die ich im Datei öffnen dialog ausgewählt habe kann ich danach nicht mit fopen öffnen da bekomme ich Fehler.

    kann es sein dass ich diese noch schließen muss oder diese vom datei öffnen dialog noch benutzt wird?

    oder woran kann das liegen?



  • ok solangsam verstehe ich.
    mit dem File open Dialog von ganz oben öffne ich die Datei.

    nun wie kann ich aus dieser datei lesen...

    also bei fopen ist es ja so
    [/cpp]
    if((eingabe_datei = fopen("test_daten","r")) == NULL)
    [cpp]
    aus eingabe_datei kann ich lesen.
    wie kann ich nun bei dem file open dialog aus der datei lesen?

    und wie schließe ich die ausgewählte datei wieder?

    nochmals danke



  • Die CRT Funktionen wollen den Pfad nur mit *einem* Slash!

    Ja Shash, aber nicht 1 Backslash. In dem String

    "d:\test\test_daten"
    

    stecken Escape-Folgen (\t).

    @tobe00023
    Warum schließt Du die Datei dann nicht (fclose)?



  • Die GetOpenFileName() Funktion liefert echt einen Filename mit Escape-Sequenzen drinner? OMG. Du koennest

    replace("\\", "\\\\", str);
    

    verwenden. (ka wie die C++ Funktion wirklich heist)

    Oder benutze einfach weiter die MFC Funktionen fuer die Dateioperationen:
    http://msdn2.microsoft.com/en-us/library/aa365467(VS.85).aspx

    ReadFile Function

    Reads data from a file, and starts at the position that the file pointer indicates. You can use this function for both synchronous and asynchronous operations.

    The ReadFileEx function is for only asynchronous operation.
    Syntax

    BOOL WINAPI ReadFile(
    __in HANDLE hFile,
    __out LPVOID lpBuffer,
    __in DWORD nNumberOfBytesToRead,
    __out_opt LPDWORD lpNumberOfBytesRead,
    __inout_opt LPOVERLAPPED lpOverlapped
    );



  • Danke ich hab die datei geschlossen.

    Aber mit flcose geht es bei dem Codesegment mit der WINAPI nicht.

    hab es mit

    CloseHandle(hf);
    

    danke jetzt funktioniert es.

    und



  • Aber mit flcose geht es bei dem Codesegment mit der WINAPI nicht

    Du hast dich sicher verschrieben. Was man mit fopen öffnet, muss man auch mit fclose(szFile) schließen.


Anmelden zum Antworten