fread & fwrite - mögliche Fehlerquellen



  • fread und fwrite liefern (wie viele andere Bibliotheksfunktionen auch) bekanntlich Rückgabewerte und genau für deinen Fall des Prüfens auf Fehler sind sie gedacht.
    RTFM



  • Es könnte sein dass dein RAM während dem Einlesen sich verabschiedet, oder ein Virus löscht dir die Datei weg... aber man muss nicht immer vom schlimmsten Fall ausgehen. 😃



  • Eine mögliche Fehlerquelle wäre ein voller Datenträger.



  • Naja ich frage nicht weil es mir zuviel ist... naja vll im prinzip schon...

    Ich frage deshalb. Weil wir für die Uni ein Programm schreiben sollen. Ich habe alle möglichen Fehlerquellen berücksichtig, die gefordert sein. Magic number. Weniger/zuviel Bytes vorhanden und was halt noch alles so gefordert ist.
    Egal was im eingelesen Binärfile steht und von der geforderten Norm abweicht fange ich per Programm ab. Ich überprüfe jede möglich Fehlerquelle im File.
    Wir haben zusätzlich die Forderung dass eine Funktion nicht länger als 70 Zeilen sein soll 😉 ... und genau deshalb meine Frage, weil meine Funktion bereits 70 Zeilen hat.
    Ich prüfe bisher nirgends fread mit ferror ab... wenn ich ferror dazu einbaue, dann bin ich definitiv über 70 Zeilen und müsste die funktion wieder auf 2 aufteilen...

    Deshalb frage ich, ob es noch weitere Möglichkeiten gibt, außer dass weniger Bytes eingelesen werden als angegeben.

    Was würde denn passieren, wenn mein fread einen fehler liefern würde... und in der nächsten Programmzeile mache ich ohne Überprüfung mit dem nächsten fread weiter? Was würde im endeffekt passieren? Wird nicht mehr weiter einglesen, oder wird der fehler von fread einfach ignoriert und weitergemacht?

    (Für letzteres ist es so, dass die Länge des Text im File angegeben ist, sprich zählt meine Schleife beim einlesen mehr oder weniger als die angegeben Länge, dann is so und so ende.)

    Mfg



  • Poste doch mal deine Funktion...
    Dann kann man dir ev auch helfen dein Programm abzuspecken.
    Den Rückgabewert solltes du bei einer Guten fehlerbehendllung umbeding einbauen.
    Return Code:

    The total number of elements successfully read is returned as a size_t object, which is an integral data type.
    If this number differs from the count parameter, either an error occured or the End Of File was reached.
    You can use either ferror or feof to check whether an error happened or the End-of-File was reached.



  • Domsi schrieb:

    Ich prüfe bisher nirgends fread mit ferror ab... wenn ich ferror dazu einbaue, dann bin ich definitiv über 70 Zeilen und müsste die funktion wieder auf 2 aufteilen...

    Die Anforderung nur maximal 70 Zeilen zu schreiben wird wahrscheinlich darauf beruhen, dass der Code sonst zu unübersichtlich wird. Deswegen würde ich mich auch an deiner Stelle daran halten und insbesondere mehrfach vertretene Abfragen in eine Funktion auslagen. Aber auch Teile die nur einmal vorkommen, können logisch gekapselt werden und die Anforderungen an den Leser verbessern.

    Domsi schrieb:

    Deshalb frage ich, ob es noch weitere Möglichkeiten gibt, außer dass weniger Bytes eingelesen werden als angegeben.

    Auch wenn du die richtige Anzahl an Bytes gelesen hast, müssen die Daten nicht zwangweise korrekt sein. Wenn aber kein Fehlerflag gesetzt wurde kannst du darauf nicht eingehen. Du könntest nur schauen ob der Inhalt der erwartete ist, soweit bekannt.

    Domsi schrieb:

    Was würde denn passieren, wenn mein fread einen fehler liefern würde... und in der nächsten Programmzeile mache ich ohne Überprüfung mit dem nächsten fread weiter? Was würde im endeffekt passieren? Wird nicht mehr weiter einglesen, oder wird der fehler von fread einfach ignoriert und weitergemacht?

    Womit willst du dann weiter machen? Die vorliegenden Daten sind bei einem Fehler als ungültig zu betrachten, egal wie viele noch kommen.



  • Danke für die vielen Infos.

    Ich habe meine funktionen jetzt so angepasst, dass ich auf ferror prüfen kann.

    Jetzt habe ich noch eine Frage.

    Wie kann ich prüfen ob ich keine Leserechte habe auf eine Datei?

    Ich soll beim Schreiben in eine Datei überprüfen ob die Datei existiert oder nicht. Ist ja kein Problem, wenn die nicht Datei vorhanden ist, dann liefert mir fopen NULL und somit gibt es die Datei nicht.

    Allerdings liefert mir fopen auch NULL wenn ich keine Leserechte habe...

    Wie kann ich prüfen ob die Datei vorhanden ist aber ich lediglich keine Lesereche habe?

    Gibt es dafür eine Funktion die mir bestimmte errorcodes liefert?
    Oder wie kann ich darauf prüfen?

    Lg,



  • Domsi schrieb:

    Wie kann ich prüfen ob die Datei vorhanden ist aber ich lediglich keine Lesereche habe?

    Sowas kennt C nicht, das musst du das OS fragen.



  • Naja ich habe aber gerade folgendes gefunden:

    perror (NULL);
    

    Liefert mir dann Permission denied

    Allerdings finde ich es nicht sehr schön dass auf so einen String zu prüfen...
    gibt es was vergleichbares mit perror? Vll einen befehl der mir eine Integer zurück liefert?



  • perror macht meines Wissens nichts anderes als den errno formatiert darzustellen.



  • Domsi schrieb:

    Naja ich habe aber gerade folgendes gefunden:
    ...

    Spreche ich denn nur Bahnhof?


Anmelden zum Antworten