【问题标题】:c++ std::ofstream flush() but not close()c++ std::ofstream 刷新()但不关闭()
【发布时间】:2010-02-26 11:25:01
【问题描述】:

我在 MacOSX 上。

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

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

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

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

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

谢谢!

【问题讨论】:

  • outFile &lt;&lt; "......." &lt;&lt; std::flush; 是更具可读性的代码。

标签: c++ flush buffering ofstream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    写入无缓冲的fstream 可能会损害性能,但在测量之前担心这一点将是过早的优化。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-05
          • 2020-11-05
          • 2019-06-17
          • 1970-01-01
          • 1970-01-01
          • 2016-02-19
          相关资源
          最近更新 更多