fread & fwrite - mögliche Fehlerquellen
-
Hallo,
ich wollte mal fragen welche Fehler können denn bei fread und bei fwrite auftretten, die mit ferror abgefangen werden müssen?
Mir fällt auf die schnelle nur ein:
* Ich lese 20 Bytes ein, aber in Wirklichkeit stehen nur 15 Bytes im File
(Dieser Überprüfung hat sich bei mir durch meinen Code bereits automatisch ergeben... ohne ferror... von ferror habe ich erst später erfahren).Ansonsten würde mir nur mehr einfallen dass während dem Lesen/Schreibe die Rechte entzogen werden.
Allerdings öffne ich die Datei... lese alles aus (inkl. Fehlerüberprüfungen) ... und mache die Datei wieder zu.
Sprich das Programm wird während dem Lesen überhaupt nie angehalten. Im Fehlerfall beendet sich das Programm. (Ob man Leserechte auf die Datei hat, prüfe ich schon beim öffnen!) Ich glaube kaum dass in diesen paar Millisekunden wo die Datei offen ist, sich plötzlich die Schreibrechte ändern!?Gibt es noch welche Möglichkeiten, wann fread und fwrite fehlschlagen können?
Vielen Dank im voraus.
Mfg,
Domsi
-
Ja, die Festplattennadel könnte abbrechen
Aber mal im Ernst.. ist dir das eineif (ferror()) ..
zu viel oder warum fragst Du?
Hörte sich jetzt irgendwie so an..^^Abgesehen davon gibts doch gar keinen error wenn man mehr liest als vorhanden ist oder täusche ich mich da? Gibts da nicht feof() oder so?
-
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 denerrno
formatiert darzustellen.
-
Domsi schrieb:
Naja ich habe aber gerade folgendes gefunden:
...Spreche ich denn nur Bahnhof?