Rückgabewerte File-Funktionen



  • Hallo,

    ich programmiere gerade für die Uni und die Leute dort legen sehr viel Wert darauf, dass bei allen möglichen (auch unsinnigen) Eingaben das Programm nicht anfängt, Mist zu bauen und auch bei allen möglichen Sachen auf Fehler getestet wird (zB malloc immer auf NULL-Rückgabe). Ist natürlich auch sinnvoll, schließlich sollen irgendwann mal die Programme auf größeren Rechnern laufen und da ist es dann eher schlecht, wenn man ihn zum Absturz bringt.

    Deswegen versuche ich jetzt, meine File-Operationen gegen Fehler abzusichern und frage mich, was da überhaupt passieren kann. Dass beim Öffnen zum Lesen die gewünschte Datei einfach nicht existieren kann, ist klar. Aber wie kann es passieren, dass

    f= fopen("beispiel.txt", "w");

    NULL zurückgibt? Kann mir da irgendwie nichts vorstellen.

    Genauso weiß ich nicht, was dabei schief gehen kann, wenn ich fprintf und fscanf benutze. Irgendwas muss es ja geben, sonst wäre es sinnlos, dass diese Funktionen Rückgabewerte haben.

    Deshalb wollte ich mal fragen, was da so alles passieren kann im Umgang mit Dateien und am besten wäre noch, wenn kurz erklärt werden würde, wie man die jeweiligen Fälle am besten handhabt.

    Vielen Dank und freundliche Grüße,

    plizzz



  • Aber wie kann es passieren, dass

    f= fopen("beispiel.txt", "w");

    NULL zurückgibt? Kann mir da irgendwie nichts vorstellen.

    zum Beispiel, wenn du keine Rechte hast in die Datei zu schreiben

    Genauso weiß ich nicht, was dabei schief gehen kann, wenn ich fprintf und fscanf benutze. Irgendwas muss es ja geben, sonst wäre es sinnlos, dass diese Funktionen Rückgabewerte haben.

    bei fprintf, wenn zB kein Speicherplatz vorhanden ist und bei fscanf und fprintf wenn zB das Medium entfernt wurde (zB USB-Stick gezogen).

    Was genau alles passieren kann, siehst du, wenn du dir die dahinter liegenden Systemfunktionen anschaust. zB unter Unix-Systemen man: open(2) und man: write(2)/man: read(2).



  • Dann heißt es also, jeden Aufruf von fprintf/fscanf so zu gestalten:

    if (fprintf != gewünschte anzahl){
    [...]Fehlerbehandlung
    }
    

    oder gibt es da etwas Besseres?



  • Viel besser gehts nicht.
    Du kannst noch die Fehlernachricht verallgemeinern, sowas wie

    fehler("datei nicht gefunden");
    

    Die Funktion kann dann GetLastError bzw errno abfragen und möglicherweise eine ordentliche Fehlermeldung ausgeben.
    Ich habe ein Macro gemacht:

    #define FEHLER(x) fehler(_FILE_, _LINE_, _FUNCTION_, x)
    

    Damit kann die fehler-funktion auch bei einem simplen FEHLER("OOM") noch sinnvolle Informationen ausgeben.



  • Ok alles klar, das mit den sinnvollen Fehlernachrichten schaue ich mir mal an.

    Vielen Dank



  • Für Fehlernachrichten gibt es schon man: perror. Da braucht man keine eigene Funktion/Macro. Aber du musst natürlich erst einmal entscheiden, ab wann ein Fehler ein Fehler für dein Programm ist und wie kritisch der Fehler ist. Ist es zB relevant jede Ausgabe zu prüfen?



  • Wobei man perror auch nochmal wrappen kann, damit man einen Dateinamen und/oder Zeile hat, in der der Fehler aufgetreten ist. Das hilft manchmal auch bisschen.



  • unter linux gäb es "perror()" bzw "char *sys_errlist[]" das liefert einen text statt nur die fehler nummer.

    lg lolo


Anmelden zum Antworten