c ++ std :: ofstream flush()但不是close()

时间:2010-02-26 11:25:01

标签: c++ flush buffering ofstream

我在MacOSX上。

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

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

在我的日志代码中我有:

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

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

谢谢!

4 个答案:

答案 0 :(得分:13)

从C ++运行时的角度来看,它本应写入磁盘。从操作系统的角度来看,它可能仍然存在于缓冲区中,但如果您的整个机器崩溃,那只会是一个问题。

答案 1 :(得分:6)

作为替代方法,您可以使用

完全禁用缓冲
outFile.rdbuf()->pubsetbuf(0, 0);

写入无缓冲的fstream可能会影响性能,但在测量之前担心这会导致过早优化。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

直到flush()返回,任何人都猜测它将在多大程度上进入磁盘。