【问题标题】:static ofstream will create a file but never write to it?static ofstream 将创建一个文件但从不写入它?
【发布时间】:2018-02-14 03:27:51
【问题描述】:

我有一个将一些数据写入文件的函数:

void log(const std::string& data) 
{
    std::ofstream out_file{ "data.txt", std::ofstream::app };
    out_file << data;
}

这工作得很好。但是,第二次我将out_file 声明更改为static,它会创建data.txt 文件,但它实际上不会向其中写入任何数据。

不会抛出异常,但即使多次调用 log 函数,文件也将始终保持为空。如果我删除static,日志功能将正常工作并写入文件。

此函数在低级键盘挂钩回调中被调用。 MSDN 声明:This hook is called in the context of the thread that installed it. 所以它不应该是与线程相关的问题。

【问题讨论】:

  • 最可能的答案是您以异常方式终止程序,不会导致全局静态对象的有序销毁,从而刷新内部流缓冲区。要么解决这个问题,要么做一个明确的std::flush
  • @Sam 程序永远不会被终止,除非它被手动关闭。主消息循环总是被调用。
  • 没有钩子能做到这一点吗?
  • 这是不正确的。不能保证&lt;&lt; 操作符会将格式化的输出物理写入文件,原因很简单,std::ofstream 使用内部流缓冲区,并且它只会在某些情况下刷新到实际文件。仅仅因为“日志功能的执行已经完成”,并不意味着实际上可以保证将任何内容写入实际文件。这不是文件流的工作方式。您必须明确刷新它们,或正确关闭/销毁它们。其中哪一部分你不清楚?
  • 当它是非静态的时,流对象通过从日志函数返回而被销毁,作为离开其范围的一部分。这就是为什么在这种情况下,所有内容都被正确写出。

标签: c++ winapi


【解决方案1】:

问题在于无法保证正确销毁全局对象。通过将以下内容添加到我的代码中:

out_file << data << std::flush;

一切都按预期进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多