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).aspxReadFile 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.
SyntaxBOOL 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.