15

我在 MacOSX 上。

在我的应用程序的记录器部分,我将数据转储到文件中。

假设我有一个全局声明std::ofstream outFile("log");

在我的日志记录代码中,我有:

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

现在,假设我的代码在 flush() 发生后崩溃;是在保证写入磁盘outFile之前写入的内容flush()(请注意,我不调用 a close())。

谢谢!

4

4 回答 4

13

从 C++ 运行时的角度来看,它应该已写入磁盘。从操作系统的角度来看,它可能仍会在缓冲区中徘徊,但这只会在您的整台机器崩溃时才会成为问题。

于 2010-02-26T11:28:38.387 回答
7

作为一种替代方法,您可以完全禁用缓冲

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

Writing to an unbuffered fstream may hurt performance, but worrying about that before measuring would be premature optimization.

于 2010-02-26T13:08:58.963 回答
2

flush() 刷新 iostream 库的缓冲区 - 但是几乎可以肯定,数据不会同时从操作系统的缓冲区中立即刷新,因此有一小段时间操作系统崩溃可能会丢失数据。当然,如果您遇到硬盘故障,无论数据是否写入,您都可以随时丢失数据,所以我不会太担心这个。

于 2010-02-26T11:30:37.400 回答
2

只要 flush() 返回,您的程序就成功地将输出交到操作系统手中。除非操作系统(或磁盘)崩溃,否则下次磁盘写入时您的数据应该在磁盘上(请注意,磁盘可能有自己的固态缓存)。

在flush() 返回之前,任何人都可以猜测它有多少会进入磁盘。

于 2010-02-26T11:50:17.687 回答