Debug Assertation Fehler bei Dateioperation mit CStdioFile



  • 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