Debug Assertation Fehler bei Dateioperation mit CStdioFile



  • 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


  • Mod

    Dürfte nicht passieren.
    Außer Dein Heap oder Stack hat schon vorher einen Hau abbekommen.



  • 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


  • Mod

    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".


  • Mod

    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 😃


  • Mod

    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.


  • Mod

    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?


Anmelden zum Antworten