Schließen Sie die Rückgabewertprüfung
Ist es erforderlich, überprüfen Sie den Rückgabewert von fclose? Wenn wir haben erfolgreich eine Datei geöffnet haben, was sind die Chancen, dass Sie möglicherweise nicht in der Nähe?
Dank!
Grüße,
Jay
InformationsquelleAutor der Frage Jay | 2009-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
fwrite
zu einer Datei, es kann nicht wirklich etwas schreiben, es kann in einen Puffer (in der DATEI-Objekt). Aufruffflush
würde tatsächlich schreiben Sie es auf der Festplatte. Der Vorgang möglicherweise fehl,zum Beispiel, wenn Sie nur genügend Speicherplatz zur Verfügung, oder es gibt einige andere I/O-Fehler.fclose
leert den Puffer implizit zu, so dass es möglicherweise nicht für den gleichen Gründen.InformationsquelleAutor der Antwort Nicolás
Vom comp.lang.c:
InformationsquelleAutor der Antwort
Man könnte (und sollte) den Fehler melden, aber in einem Sinn, der stream ist immer noch geschlossen:
InformationsquelleAutor der Antwort LnxPrgr3
fclose()
wird flush ungeschriebenen Ausgang (überfflush()
) vor der Rückkehr, so dass der Fehler resultiert aus der zugrunde liegendenwrite()
wird nicht berichtetfwrite()
oderfprintf()
Zeit, aber wenn Sie tun, diefclose()
. Als Ergebnis werden alle Fehler, diewrite()
oderfflush()
erzeugen kann, generiert werden kannfclose()
.fclose()
auch nennenclose()
erzeugt werden können Fehler, die sich auf NFS-clients, wo die geänderte Datei gar nicht hochladen auf den remote-server bisclose()
Zeit. Wenn der NFS-server ist abgestürzt, dann werden dieclose()
fehl, und sofclose()
wird scheitern, wie gut. Dies wahr sein könnte, von anderen vernetzten Dateisystemen.InformationsquelleAutor der Antwort geocar
Muss man IMMER überprüfen, Ergebnis der fclose()
InformationsquelleAutor der Antwort vitaly.v.ch
Sagen wir, Sie sind die Erzeugung von Daten. Sie haben alte Daten, die Sie
fread()
aus einer Datei, und führen Sie dann einige Verarbeitung auf die Daten, generieren Sie mehr Daten, und dann schreiben Sie in eine neue Datei. Sie sind vorsichtig, um nicht die alte Datei überschreiben, weil Sie wissen, dass der Versuch, neues zu schaffen-Datei kann fehlschlagen, und Sie möchten, dass Ihre alten Daten, in diesem Fall (einige Daten sind besser als gar keine Daten). Nach Abschluss aller diefwrite()
s, die alle erfolgreich sind (weil Sie akribisch überprüft den Rückgabewert vonfwrite()
), Siefclose()
Sie die Datei. Dann, Sierename()
Ihre just-Datei geschrieben und die alte Datei überschreiben.Wenn
fclose()
ist fehlgeschlagen, da der write-Fehler (Datenträger voll?), Sie einfach überschrieben haben, Ihre Letzte gute Datei mit etwas, das könnte sein, junk. Oops.So, wenn es wichtig ist, Sie sollten überprüfen Sie den Rückgabewert von
fclose()
.In Bezug auf code:
In dem obigen code, haben wir vorsichtig über
fopen()
fwrite()
undfread()
aber selbst dann nicht die Kontrollefclose()
zu Datenverlust führen kann (bei der Kompilierung mitMAYLOSE_DATA
definiert).InformationsquelleAutor der Antwort Alok Singhal
Einen Grund fclose scheitern kann, ist, wenn es alle Daten noch gepuffert und die implizite fflush ausfällt. Was ich empfehlen ist, rufen Sie immer fflush und machen alle Fehler-handling gibt.
InformationsquelleAutor der Antwort R Samuel Klatchko
Habe ich viele Male gesehen fclose() die Rückgabe null.
Und bei sorgfältiger Untersuchung fand heraus, dass das eigentliche problem war mit dem schreiben und nicht mit fclose.
Da die Sachen, die geschrieben werden gepuffert werden, bevor die eigentliche schreiben passiert, und wenn ein fclose() wird aufgerufen, alle Puffer geleert wird. Also, ein problem in schreiben der gepufferten suff, sagen, wie Festplatte voll, wird angezeigt, während der fclose(). Als David Yellen sagt, zu schreiben, ein Kugel-Beweis-Anwendung, die Sie benötigen, zu prüfen, den return-Wert von fclose().
InformationsquelleAutor der Antwort codaddict
Den fclose Mann Seite zitiert, dass es unter Umständen nicht für aus Gründen, die in der Nähe oder fflush fehlschlagen.
Zitieren:
fflush kann scheitern, aus Gründen, die schreiben() fehlschlagen würde, grundsätzlich in der Veranstaltung, die Sie kann nicht wirklich schreiben/speichern Sie die Datei.
InformationsquelleAutor der Antwort poundifdef
Wenn Sie in den Kontext Ihrer Anwendung, können Sie denken, etwas sinnvolles zu tun, wenn fclose() fehlschlägt, testen Sie dann die return-Wert. Wenn Sie nicht können, nicht.
InformationsquelleAutor der Antwort
In einem Sinn, schließen einer Datei nie versagt: Fehler werden zurückgegeben, wenn eine pending write-operation ist fehlgeschlagen, aber der stream wird geschlossen werden.
Probleme zu vermeiden und sicherzustellen (so weit wie Sie können von einem C-Programm), schlage ich Ihnen vor:
fwrite()
.fflush()
vor dem schließen des Streams. Tun denken Sie daran, für Fehler, die durchfflush()
.InformationsquelleAutor der Antwort Danilo Piazzalunga