2010-02-26 103 views
11

我在MacOSX上。C++ std :: ofstream flush()但不關閉()

在我的應用程序的記錄器部分,我將數據轉儲到文件中。

假設我有一個全局聲明std::ofstream outFile("log");

,並在我的日誌記錄代碼,我有:

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

,假設沖洗後,我的代碼崩潰()情況;在flush()保證寫入磁盤之前,是否寫入outFile(請注意,我不稱之爲close())。

謝謝!

+0

'outFile <<「.......」<< std :: flush;'是更具可讀性的代碼。 – 2014-07-27 16:56:51

回答

11

從C++運行時的角度來看,它應該被寫入磁盤。從操作系統的角度來看,它可能仍然存在於緩衝區中,但如果整個機器崩潰,這只是一個問題。

2

flush()刷新iostream庫的緩衝區 - 但是幾乎肯定不會立即從操作系統的緩衝區中同時刷新數據,因此在操作系統崩潰期間可能會丟失數據的一小段時間。如果遇到硬盤故障,無論數據是否寫入,您都可以隨時丟失數據,所以我不會過多擔心這一點。

0

只要flush()已經返回,您的程序已經成功地將輸出放在操作系統的手中。除非操作系統(或磁盤)崩潰,否則下次磁盤寫入時應將數據放在磁盤上(請注意磁盤可能具有自己的固態緩存)。

在flush()函數返回之前,任何人都會猜測它會將多少數據寫入磁盤。

6

作爲一個替代方法,你可以用

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

寫入無緩衝fstream可能會損害性能,但測量將是不成熟的優化前的擔心是完全禁用緩衝。