正确选择文件流对象

时间:2011-06-21 16:29:33

标签: c++ fstream ifstream ofstream rapidxml

应用程序使用RapidXML编辑XML文件。编辑不是自动化的,偶尔也会发生:XML内容显示在GUI中,用户执行一些更改XML的操作。必须立即将每个更改保存到磁盘。

加载RapidXML文档对象需要将文件内容复制到字符串中。文档中的每次更改之后都会将文档对象的内容复制回文件中。

在此示例中,文件用于输入和输出。 在这种情况下,是否应将单个std::fstream对象用于所有输入/输出操作?它将在应用程序启动时打开一次,用于输入/输出,并在应用程序结束时关闭。

或者,每当需要执行文件输入/输出时,是否应使用std::ifstreamstd::ofstream的本地(临时)实例?例如。 std::ifstream在开头用于读取文件(打开,读取,关闭);类似地,只要DOM必须导出到文件中(开放,写入,关闭),就要使用std::ofstream实例。

我不关心这里的表现(由于应用程序的性质),但我很好奇在这种情况下正确选择文件流对象。

2 个答案:

答案 0 :(得分:3)

当要重写的数据量与原始数据不同时,编辑文件真是太痛苦了。如果您的文件格式要求数据是顺序的没有漏洞的语法,那么您实际上没有选择,只能重写文件(至少从修改位置的开头)

此外,还有其他限制。如果您需要在继续之前将数据刷新到磁盘,那么您可以使用单个std::fstream进行多次编辑。即使在文件流上调用flush()方法,操作系统通常也不会将文件刷新到磁盘。有些平台提供非便携式解决方案来真正强制写入。因此,如果您需要将其刷新到磁盘,最好的办法是实际关闭文件。

因此,特别是对于关键应用程序,我建议采用第二种方法(初始加载时为ifstream,每次写入时为ofstream。我还建议写入临时文件,然后将完整的重写写入首选位置,替换原始文件。这可以确保您不会丢失任何数据(至少在提供原子文件移动的系统上)。

答案 1 :(得分:2)

我绝对赞成std::ifstreamstd::ofstream的本地临时实例 std::ofstream。我甚至不确定它会不会起作用;打开一个 {{1}}清空现有文件的内容。只是寻求 到开头并覆盖不删除任何以前的内容, 如果更改结果缩短了文件,您仍然会被遗忘 使用早期内容中的剩余字符。