Debug Assertation Fehler bei Dateioperation mit CStdioFile
-
Sehr eigenartig; ein Problem hatte ich als ich eine globale Variable am falschen Ort deklarierte aber das ist hier ja nicht der Fall; es ist ja alles verwendete in diesem Block deklariert (im Release-Modus stürzt das Programm ab).
-
Debuginformationen für den Release-Modus generieren und die Release-Version im Debugger starten.
-
Hallo,
C. M. Obrecht schrieb:
Ich habe folgende Meldung (Bild im Link) bei dieser Operation:
try{ CString stri; CStdioFile File; File.Open(LPCTSTR("NadjaBrowserStartseite.ini"), CFile::modeRead); File.ReadString(stri); File.Close(); Navigate2(stri,NULL,NULL); } catch(CFileException) { }http://rebenstudio-it.ch/Unbenannt.jpg
Wieso das? Konnte keine Ursache/Lösung finden; CStdioFile mit einer dialogbasierenden MFC-Anwendung habe ich schon erfolgreich verdenet (aber mit VC++6).Vielen Dank
Wahrscheinlich kann die Datei "NadjaBrowserStartseite.ini" nicht gefunden bzw. geöffnet werden. Eine CFileException kann übrigens durch die hier verwendete Methode des Datei-Öffnens nicht auftreten.
MfG,
Probe-Nutzer
-
Ach so wenn die Datei nicht gefunden wird wird keine Exception erzeugt und dadurch funktioniert try auch nicht? Vielen Dank! Wie kann man das Problem lösen?
Ich habe zwar die Datei selbst erstellt in dem Programmordner (Release/Debug), womöglich wird im Ausführungsmodus diese aber in einem anderen Ordner gesucht? Sollte schon nicht das Programm abstürzen wenn die Datei nicht vorhanden ist...
-
C. M. Obrecht schrieb:
Ach so wenn die Datei nicht gefunden wird wird keine Exception erzeugt und dadurch funktioniert try auch nicht? Vielen Dank! Wie kann man das Problem lösen?
Ja genau, so wie du es programmiert hast, kommt keine Ausnahme zustande. Du hättest z.B. bei Open ein CFileException-Objekt übergeben können, das macht den try-catch-Block überflüssig:
CString stri; CStdioFile File; CFileException ex; if (File.Open(LPCTSTR("NadjaBrowserStartseite.ini"), CFile::modeRead, &ex)) { File.ReadString(stri); File.Close(); Navigate2(stri,NULL,NULL); } else { ex.ReportError(); }C. M. Obrecht schrieb:
Ich habe zwar die Datei selbst erstellt in dem Programmordner (Release/Debug), womöglich wird im Ausführungsmodus diese aber in einem anderen Ordner gesucht?
Ja, ich vermute, dass du kein Ausführungsverzeichnis gesetzt hast (dann wird im Verzeichnis der Projekt-Datei gesucht) , wenn du über die Entwicklungsumgebung gestartet hast. Man kann ein Verzeichnis setzen über "Projekteigenschaften"->"debugging"->Arbeitsverzeichnis ("working directory")
MfG,
Probe-Nutzer
-
Man kann natürlich auch mit der Konstruktor Version arbeiten, dann gibt es auch wieder eine Exception.
-
Muss man bei CStdioFile nicht CFile::typeText mit angeben?
Also statt "CFile::modeRead" einfach "CFile::modeRead | CFile::typeText".
-
Nein! Wenn man es weglässt wird dennoch CFile::typeText verwendet.
Man muss explizit typeBinary angeben um "nicht den Texmode" zu erhalten.
-
Morgen werde ich versuchen ob es am Fehlen der Datei liegt. Aber wie kann ich das im späteren Einsatz des Programmes vermeiden? Eine andere Methode Text zu lesen und schreiben in Dateien? Allerdings beim Testprojekt in welchem ich CStdioFile probierte kam es zu keinen Schwierigkeiten, das war aber auch VC6 sollte aber keine ROlle spielen (aber wer weiss).
In .NET kenne ich die Methode um gleich den Anwendungspfad zu erhalten. Wie heisst die in MFC?
Danke

-
Jede 5 Frage dreht sich hier darum, wie man den Anwendungspfad bekommt...

http://www.mpdvc.de/html.htm#Q13
-
Martin Richter schrieb:
Nein! Wenn man es weglässt wird dennoch CFile::typeText verwendet.
Man muss explizit typeBinary angeben um "nicht den Texmode" zu erhalten.In der MSDN steht mann muss bei CStdioFile entweder typeText oder typeBinary angeben, und die Beispiele machen das auch alle so.
Dachte mir nur die Assertion könnte daher kommen.
-
hustbaer schrieb:
In der MSDN steht mann muss bei CStdioFile entweder typeText oder typeBinary angeben, und die Beispiele machen das auch alle so.
Dachte mir nur die Assertion könnte daher kommen.Manchmal ist der Code besser als die Doku

Auszug aus dem Quellcode von CStdioFile:if (nOpenFlags & typeBinary) szMode[nMode++] = 'b', nFlags ^= _O_TEXT; else szMode[nMode++] = 't';
-
Ja und es war wirklich nur das mit der nicht vorhandenen Datei, nun geht's. Muss aber die Datei auch sicher vorhanden sein. Gibt es (ähnliches Verfahren für Favoritenspeicherung vorgesehen) eine Alternative?