Dateispeicherung / beschreiben / erstellen CSTdioFile
-
Hallo Zusammen,
ich denke mein Problem ist ein alter Hut und mit Sicherheit gibt es in diesem Forum bereits eine Antwort. Da ich aber diese nicht finde, bleibt mit keine andere Wahl als euch damit zu belästigen:
Ich möchte eine Art Logfile erstellen. Nach einer Bestimmten Prozessur sollen Daten in einem Textfile gespeichert werden.
Aktiviert wird dies über einen Button.Drücke Button
Dialogfeld öffnet sich mit Speichern unter.
Wenn es keine Datei gibt, soll diese angelegt werden.
Ansonsten soll das Ende der Datei gefunden und Daten angehängt werden.Was nicht funktioniert ist das erstellen einer neuen Datei in diesem Dialogfeld.
Bestimmt habe ich die Falschen parameter gewählt.Hier der CODE:
char zwsp[255]; int i,j, k,numofsstrings; unsigned long length=0; char szFilters[]= " (*.txt)|*.txt|All Files (*.*)|*.*||"; CString strDate, str_zwsp; CFileDialog fileDlg (FALSE, "txt", "*.txt", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); if( fileDlg.DoModal ()==IDOK ) { CString pathName = fileDlg.GetPathName(); CString fileName = fileDlg.GetFileTitle (); SetWindowText(fileName); CStdioFile file(pathName,CFile::modeReadWrite); // finde das Ende der geöffneten Datei!! file.SeekToEnd(); pos = file.GetPosition();Wenn ich im Dialogfeld eine neue Datei benennen will, bekomme ich eine
Fehlermeldung dass die Datei nicht existiert.
Füge ich dann in die Zeile CStdioFile file(pathName,CFile::modeReadWrite);
den |CFile::modeCreate ein, kann ich zwar eine Datei neu erstellen, allerdings vorahande Dateien, die man auswählt, werden dann gnadenlos überschrieben. SeekToEnd liefert dann NULL.Auch versucht habe ich Create und NoTruncate zu kombinieren, habe aber dann die Fehlermeldung, das Beim Zurgriff auf Datei ein voller Datenträger gemeldet wurde.
Mit Sicherheit banaler Fehler, aber Unwissenheit, gepaart mit Wald und Bäumen produzieren keine Lösungen.
Vielen dank im Voraus
Gruß
CM_HT
-
Das meiste was Du hier fragst lässt sich aus der MSDN Doku sofort erlesen.
1. Was glaubst Du was das Flag OFN_FILEMUSTEXIST bedeutet? Du kannst es Dir denken...

http://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx
2. Lies mal die CFile Doku:
http://msdn.microsoft.com/en-us/library/cz0a83sb(VS.80).aspxCFile::modeNoTruncate Combine this value with modeCreate. If the file being created already exists, it is not truncated to 0 length. Furthermore, if the file being created already exists, the underlying file pointer will point to the beginning of the file. This flag guarantees the file to open, either as a newly created file or as an existing file. This might be useful, for example, when opening a settings file that may or may not exist already. This option applies to CStdioFile as well.
3. Wenn Du einen Fehler bekommst, wie hast Du den ausgewertet?
Was steht in der CFileException drin? Gib eine mit an wenn Du den Open ausführst. Siehe Doku:
http://msdn.microsoft.com/en-us/library/hwbccf8z(VS.80).aspx
Zuallerletzt wenn das nicht hilft oder zu Erkenntnissen führt: Was sagt GetLastError?
-
Danke Martin für Deine schnelle Antwort.
Und Danke für die LinksOFN_FILEMUSTEXIST hat dort nichts zu suchen.
es müsste OFN_CREATEPROMT sein, damit ein Fenster aufgeht das
Fragen sollte ob die Datei angelegt werden soll oder nicht. Und
das tut es nicht, nach Beendigung des Dialogs.Ich habe jetzt file.Open in eine If Abfrage gelegt:
f (!file.Open(pathName, CFile::modeReadWrite,&e)) { TRACE(_T("File could not be opened %d\n"), e.m_cause); }und ich bekomme e.cause = 2 fileNotFound
wenn ich
CFile::modeCreate |CFile::modeNoTruncate | einfüge wird dann das File einfach
neu angelegt.
Ich stehe bis auf die Fehler Meldungen ziemlich am Anfang.Hilfreich waren die Infos über die Fehler Meldungen
Also wo kann sonst noch mein Fehler liegen?
Danke schnonmal
Claus
-
Warum schaust Du nicht als erstes ob die Datei existiert, wenn nicht wird die mit create neu erstellt, existiert die datei wird die mit read/write geöffnet.
zum testen ob das File existiert is vielleicht:
static BOOL PASCAL GetStatus( LPCTSTR lpszFileName, CFileStatus& rStatus );interessant.
Gruß Matthias
-
Man muss nur die MSDN lesen!
Du musst modeCreate modeNoTruncate und modeReadWrite angeben!
-
@ Mattihas
Das werde ich gleid testen, das kannte (GetStatus) ich noch nicht
danke.@ Martin
Martin Richter schrieb:
Man muss nur die MSDN lesen!
Du musst modeCreate modeNoTruncate und modeReadWrite angeben!Ich habe alle 3 modes mit oder verknüpft. Und genau das hat nicht funktioniert.
Deswegen bin ich ja so verwirrt. Es war wie wenn er garnicht prüft, ob die Datei da ist oder nicht. sie wird angelegt und wenn sie da ist von Zeile 0 gleich überschrieben. hier der von mir getestete code:CFileDialog fileDlg (FALSE, "txt", "*.txt", OFN_HIDEREADONLY, szFilters, this); if( fileDlg.DoModal ()==IDOK ) { CString pathName = fileDlg.GetPathName(); //Change the window's title to the opened file's title. CString fileName = fileDlg.GetFileTitle (); SetWindowText(fileName); CStdioFile file; if (!file.Open(pathName, CFile::modeCreate |CFile::modeNoTruncate |CFile::modeReadWrite ,&e)) { TRACE(_T("File could not be opened %d\n"), e.m_cause); }Nehme ich die ersten beiden modes raus und teste dies an einer vorhandenen Datei
dann fügt er neues auch unten an, so wie es sein soll.erstelle ich dann eine Datei im dialog, bekomme ich ohne den beiden modes Create und Truncate eine Fehlermeldung.
sind diese modes vorhanden, dann überschreibt er die ausgewählte Datei ab der ersten Zeile.
Oder er legt eine neue an. Ich habe aber immer nur die aktuellen Daten.Gruß
Claus
-
Kann ich nicht nachvollziehen.
CStdioFile verwendet fopen aus der CRT. Debugge selber in den code hinein.
Wenn alle drei modes gesetzt werden wird "a+" ausgewählt für den fopen!