c++ - 正确选择文件流对象

标签 c++ fstream ifstream ofstream rapidxml

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

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

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

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

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

最佳答案

当要重写的数据量与原始数据不同时,就地编辑文件真的很痛苦。如果您的文件格式要求数据是连续的并且没有空洞语法,那么您别无选择,只能重写文件(至少从修改后的位置开始) .

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

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

关于c++ - 正确选择文件流对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428767/

相关文章:

c++ - Fstream 没有从二进制数据中读取完整的结构 (C++)

c++ - 如果先前打开失败,则 ifstream.read 对现有文件失败

c++ - 在其声明语句中修改变量是否定义明确?

c++ - 如何在 C++ 中删除集合或如何将集合的大小调整为 0

c++ - 读取文件的最后一行

c++ - 读取文件 ".txt"并将每一行的数据分配给循环列表中的新节点 C++

c++ - 为什么这个函数调用在通过类型转换的函数指针调用它后表现得很好?

C++读取文件并转换数据

c++ - 从 C++ 中的多行 txt 文档中读取数字

c++ - 文件读取类C++