我在 MacOSX 上。
在我的应用程序的记录器部分,我将数据转储到文件中。
假设我有一个全局声明std::ofstream outFile("log");
在我的日志记录代码中,我有:
outFile << "......." ;
outFile.flush();
现在,假设我的代码在 flush() 发生后崩溃;是在保证写入磁盘outFile
之前写入的内容flush()
(请注意,我不调用 a close()
)。
谢谢!
从 C++ 运行时的角度来看,它应该已写入磁盘。从操作系统的角度来看,它可能仍会在缓冲区中徘徊,但这只会在您的整台机器崩溃时才会成为问题。
作为一种替代方法,您可以完全禁用缓冲
outFile.rdbuf()->pubsetbuf(0, 0);
Writing to an unbuffered fstream
may hurt performance, but worrying about that before measuring would be premature optimization.
flush() 刷新 iostream 库的缓冲区 - 但是几乎可以肯定,数据不会同时从操作系统的缓冲区中立即刷新,因此有一小段时间操作系统崩溃可能会丢失数据。当然,如果您遇到硬盘故障,无论数据是否写入,您都可以随时丢失数据,所以我不会太担心这个。
只要 flush() 返回,您的程序就成功地将输出交到操作系统手中。除非操作系统(或磁盘)崩溃,否则下次磁盘写入时您的数据应该在磁盘上(请注意,磁盘可能有自己的固态缓存)。
在flush() 返回之前,任何人都可以猜测它有多少会进入磁盘。