2010-02-26 12 views
11

Ich bin auf MacOSX.C++ std :: ofstream flush() aber nicht schließen()

Im Logger-Teil meiner Anwendung, dende ich Daten in eine Datei.

nehme an, ich habe ein global std::ofstream outFile("log"); erklärt

und in meinem Logging-Code ich habe:

outFile << "......." ; 
outFile.flush(); 

Nun, mein Code stürzt nach dem Flush annehmen() geschieht; Ist das Zeug geschrieben outFile vor der flush() garantiert, auf die Festplatte geschrieben werden (beachten Sie, dass ich nicht anrufen close()).

Danke!

+0

'outFile <<" ....... "<< std :: flush;' ist lesbarer Code. –

Antwort

11

Aus Sicht der C++ - Laufzeit sollte es auf die Festplatte geschrieben worden sein. Aus der Sicht eines Betriebssystems könnte es noch in einem Puffer verweilen, aber das wird nur ein Problem sein, wenn der ganze Rechner abstürzt.

2

flush() löscht die Puffer der iostream-Bibliothek - die Daten werden jedoch fast nicht sofort aus den Puffern des Betriebssystems zur selben Zeit gelöscht. Es gibt also einen kleinen Zeitraum, in dem ein Betriebssystemabsturz Daten verlieren könnte . Sie können natürlich jederzeit Daten verlieren, wenn Sie einen Festplattenfehler haben, ob die Daten geschrieben wurden oder nicht, also würde ich mir nicht zu viele Gedanken darüber machen.

0

Solange flush() zurückgegeben wurde, hat Ihr Programm die Ausgabe erfolgreich in die Hände des Betriebssystems gelegt. Wenn das Betriebssystem (oder der Datenträger) nicht abstürzt, sollten sich Ihre Daten beim nächsten Schreiben auf dem Datenträger befinden (beachten Sie, dass der Datenträger wahrscheinlich über einen eigenen Solid-State-Cache verfügt).

Bis flush() zurückkehrt, kann niemand ahnen, wie viel es auf die Festplatte bringt.

6

Als alternativer Ansatz, können Sie Pufferung zusammen mit

outFile.rdbuf()->pubsetbuf(0, 0); 

Schreiben in einer ungepufferten fstream kann die Leistung weh tun, aber sich darum zu kümmern, dass deaktivieren, bevor wäre verfrüht Optimierung zu messen.

Verwandte Themen