c++ - ofstream(mode ios::out) 在系统停止时删除现有文件空白

标签 c++ boost iostream ofstream boost-propertytree

使用场景是工业(不稳定的电源和其他有问题的程序/硬件)。要求程序在断电(或蓝屏死机)时不受影响地恢复。操作系统是带有 NTFS 的 Windows 7。

我使用 boost::property_tree write json 将参数记录到人类可读的文本文件中。

boost::property_tree::write_json("logic.txt", pt);

它有时会在系统停止时删除“logic.txt”。 我使用默认的 ios::out 读取了 boost 源文件和 write_json 调用 ofstream

std::basic_ofstream<typename Ptree::key_type::value_type> stream(filename.c_str());        

问题应该是在系统出现故障时删除现有文件并留下空白文件。

这是 ofstream 的已知问题吗?对此最合适的解决方案是什么? 我能想到一些:

  1. 先将文件写入“logic_tmp.txt”,完成后,删除“logic.txt”并将临时文件重命名为logic.txt。

  2. 使用 SQLite 而不是直接写入文件。 (MySQL 坏了几次,再次启动时需要“修复”表,SQLite 还没有让我失望)

任何建议都会有所帮助。

最佳答案

简单的解决方案是您的#1:写入一个临时文件然后重命名。但是,请注意,对于原子重命名,临时文件应该在同一个文件系统上。最安全的方法是将其简单地存储在同一目录中。当然,您可以使用 mkstemp() 或类似工具来确保您拥有唯一的临时文件名。

以上仍然不是所有可能系统的 100% 保证,因为它取决于您的文件系统语义(您没有告诉我们您使用的是什么文件系统)。

如果你想要一个更可靠的解决方案,你的#2 是个好主意:使用 SQLite。它已经在您描述的许多场景中进行了测试。参见 https://www.sqlite.org/testing.html

关于c++ - ofstream(mode ios::out) 在系统停止时删除现有文件空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38863874/

相关文章:

c++ - 如何在 C++ 中绕过 << 调用,就好像 "#ifndef DEBUG"宏一样?

c++ - 将第三方模块的控制台输出/错误重定向到日志文件

c++: 错误: 无法识别的命令行选项 ‘-std=gnu++14’

c++ - 为什么 bcp 会为 Boost program_options 计算这么大的依赖列表?

c++ - C++ 中的 bool 表达式解析器

c++ - 使用 bimap 中的键访问值

java - 如何序列化将对象保存在文件编辑上或清空它并再次填充它(查看前)?

c++ - 哪个是更好的方法 - 将 `const reference` 与 `boost::shared_ptr<Class>` 存储为成员变量

c++ - wchar 变量的意外更改

c++ - 通过回溯在迷宫中寻找路径