2009-04-24 13 views
3

Wenn ein Aufruf von fread() 0 zurückgibt und ferror() einen Fehler (vs. EOF) anzeigt, ist es OK, den Lesevorgang erneut zu versuchen, oder ist es besser, die Datei zu schließen und erneut zu öffnen?Was ist ein guter Weg, um sich von einem Fehler fread() zu erholen?

Ich kann nicht von vorne anfangen - die Eingabedatei wurde teilweise auf eine Weise verarbeitet, die nicht rückgängig gemacht werden kann (sagen wir schreibe ein Stück auf einmal zu einem Socket und aufgrund vorhandener Protokoll , habe keine Möglichkeit, das entfernte Ende zu sagen, "egal, ich muss von vorne anfangen").

Ich könnte fclose() und fopen() die Datei fseek() hinter die bereits verarbeiteten Daten stellen und die fread() - Anweisung von dort fortsetzen, aber ist das alles notwendig?

Antwort

6

Es gibt keine "eine Lösung für alle", da verschiedene Fehler unterschiedliche Handhabung erfordern können. Fehler von fread() sind ungewöhnlich; Wenn Sie es richtig aufrufen, kann ein Fehler eine Situation anzeigen, die den FILE* in einem seltsamen Fehlerzustand verlassen hat. In diesem Fall sind Sie am besten telefonisch fclose(), fopen(), fseek(), um Dinge in einem guten Zustand zu bekommen.

Wenn Sie Codierung für etwas, das passiert, geben Sie bitte die tatsächlichen Fehler Sie von ferror() bekommen ...

+0

Wie kann ich feststellen, welche Art von Fehler mit fread() aufgetreten ist? Ich denke nicht, dass errno eingestellt wird (zumindest nicht gemäß dem C-Standard). fread() wird korrekt aufgerufen, das Problem liegt beim zugrunde liegenden Dateisystem. – Dan

+0

ferror() gibt bei einem Fehler ungleich Null zurück. Verwenden Sie dieses Ergebnis, um nach bestimmten Fehlern zu suchen, oder übergeben Sie perror()/strerror, um zu sehen, was Sie bekommen. – dwc

6

Sie die clearerr Funktion einen Blick geben kann.

+0

Guter Punkt. Wenn ich das fread() erneut versuchen möchte, ohne die Datei zu schließen/zu öffnen, muss ich zuerst clearerr(). – Dan

+0

FWIW, wenn Sie einen Stream nach einem Fehler lesen möchten, müssen Sie den Fehler mit clearerr löschen. Dieses Verhalten wird vom Standard als eine tragbare Sache definiert. – dirkgently

+0

+1, wünschte, ich hätte zuerst darüber nachgedacht;) – dwc

0

Sie können den Fehler mit perror() oder strerror() dem Benutzer anzeigen und sie fragen, ob sie es erneut versuchen möchte.

Es ist jedoch nicht obligatorisch, dass die Implementierung eine solche Fehlermeldung anzeigt. Sie sollten errno auf 0 setzen, bevor Sie fread() anrufen; Wenn es fehlschlägt und errno immer noch 0 ist, sind keine Fehlerinformationen verfügbar.