C++ 如何为长时间运行的程序输出文件

C++ 如何为长时间运行的程序输出文件,c++,file-io,C++,File Io,我写了一个模拟程序。在每个时间步中,它将一个输出块写入一个文件。它仍在开发中,因此有时会崩溃或被用户终止。在这种情况下,为了调试和分析,我仍然希望我的文件处于正确的状态,包含已经写入的数据 目前,我做了以下工作: 在程序启动时,我以非追加方式打开文件并立即关闭,只是为了清空文件: file.open(fname, std::ios::binary); file.close(); file.open(fname, std::ios::binary | std::ios::app); ... //

我写了一个模拟程序。在每个时间步中,它将一个输出块写入一个文件。它仍在开发中,因此有时会崩溃或被用户终止。在这种情况下,为了调试和分析,我仍然希望我的文件处于正确的状态,包含已经写入的数据

目前,我做了以下工作:

在程序启动时,我以非追加方式打开文件并立即关闭,只是为了清空文件:

file.open(fname, std::ios::binary);
file.close();
file.open(fname, std::ios::binary | std::ios::app);
... // data is written here
file.close();
在每个时间步,我首先打开附加文件,写入数据,然后关闭文件:

file.open(fname, std::ios::binary);
file.close();
file.open(fname, std::ios::binary | std::ios::app);
... // data is written here
file.close();

这是解决问题的好方法还是您推荐其他方法?不,这种方法会浪费很多时间

您是否尝试编写信号处理程序以正确清理?您可以处理大多数事情,例如用户按下Control-C并在退出前关闭文件


另一个想法是关闭缓冲。最简单的方法可能是将STDERR重定向到您的文件,因为默认情况下该文件是无缓冲的。

您的代码已将文件与您已写入的数据一起保存。如果程序崩溃,为什么不使用异常处理,以便在程序终止之前关闭文件?这是一个有趣而棘手的问题。应用程序崩溃时,操作系统将关闭该文件。手动关闭它可能没有什么区别。首先,你的操作系统是什么?@ZachiShtain:如果程序崩溃,那么就没有更多的异常处理了。如果异常处理发生在崩溃之前,那么
std::ofstream
的析构函数将确保文件已关闭。与其使用
app
打开
,还不如使用
close
-为什么不简单地使用
flush