Using cstdio
,覆盖文件最安全的方法是什么?在这种情况下,“安全”意味着文件不会变得不完整或损坏;该文件将被完全覆盖,或者如果出现问题,它将是旧文件。
我想最好的方法是创建一个临时中间文件,然后在中间完成后覆盖旧文件。如果这确实是最好的方法,那么似乎还有其他一些问题可能出现,尽管这种情况很少见。
- 如果程序在覆盖时退出,我如何知道使用另一个文件?
- 如果程序在创建过程中退出,我怎么知道不使用其他文件?
- 我怎么知道原始文件或
中间处于未定义状态(因为它可能会以某种方式失败
仍然可读,但其中包含的数据有微妙的错误)?
我想这有一个好的做法,但我还没有找到。这是用于保存的游戏数据;只有一个文件,并且每次都会覆盖整个文件,无需担心部分覆盖或追加。
正如其他人所说,保留现有文件,然后写入新文件。如果它非常重要(即用户不可能恢复该信息),请确保周围还有一个“备份”文件(例如,如果您的程序保存了abc.config
,留下一个abc.old.config
or abc.backup
[如果你想保证这个名字在任何地方都有效,.cfg
and .bak
可能是更好的选择])。
当您写入文件时,请在文件中放置某种结束标记,以便您可以确定文件是完整的。如果您想避免“用户编辑”文件,您可能还需要内容的校验和(sha1、md5 或类似的)。如果结束标记不存在,或者校验和错误,那么您就知道该文件是“坏的”,因此不要使用它并进行备份。
- 将新内容写入临时文件(例如
fstream fout("abc.tmp");
)
- 删除备份文件(如果存在)(例如
remove("abc.bak");
)
- 将现在的旧文件重命名为备份名称(例如
rename("abc.cfg", "abc.bak");
)
- 将新文件重命名为旧文件(例如
rename("abc.tmp", "abc.cfg"
);
对于所有步骤(特别是写入实际数据),检查是否有错误。您需要决定哪里可以出现错误,哪里不能出现错误(remove
例如,一个不存在的文件是可以的,但是如果rename
不起作用,你可能应该停止,否则你可能会得到一些不好的结果)。
加载文件时,检查所有步骤,如果出错,返回备份文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)