首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当系统停止时,ofstream(模式ios::out)擦除现有文件的空白

当系统停止时,ofstream(模式ios::out)擦除现有文件的空白
EN

Stack Overflow用户
提问于 2016-08-10 03:46:35
回答 1查看 147关注 0票数 0

使用场景是工业的(不稳定的电源和其他故障程序/硬件)。当电源关闭(或蓝屏崩溃)时,程序必须不受影响地返回。操作系统是Windows 7和NTFS。

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

代码语言:javascript
复制
boost::property_tree::write_json("logic.txt", pt);

有时,当系统停止时,它实际上删除了"logic.txt“。我使用默认的ios::out读取boost源文件和write_json流调用

代码语言:javascript
复制
std::basic_ofstream<typename Ptree::key_type::value_type> stream(filename.c_str());        

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

这是已知的问题吗?对此,最合适的解决办法是什么?我能想到几个:

  1. 首先将文件写入"logic_tmp.txt“,完成后,删除" logic.txt”并将临时文件重命名为logic.txt。
  2. 使用SQLite而不是直接写入文件。(MySQL坏了几次,重新启动时需要“修理”桌子,SQLite还没有让我失望)

任何建议都会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 05:07:07

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

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

如果您想要一个更好的防弹解决方案,那么您的第二种解决方案是个好主意:使用SQLite。它已经在很多像你描述的场景中进行了测试。请参阅https://www.sqlite.org/testing.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38863874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档