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