C++ 正确选择文件流对象

C++ 正确选择文件流对象,c++,fstream,ifstream,ofstream,rapidxml,C++,Fstream,Ifstream,Ofstream,Rapidxml,应用程序使用RapidXML编辑XML文件。编辑不是自动化的,偶尔也会发生:XML内容显示在GUI中,用户执行一些更改XML的操作。每次更改都必须立即保存到磁盘 加载RapidXML文档对象需要将文件内容复制到字符串中。文档中的每次更改都会将文档对象的内容复制回文件中 在本例中,文件用于输入和输出在这种情况下,所有输入/输出操作是否应使用单个std::fstream对象?它将在应用程序启动时打开一次,用于输入/输出,并在应用程序结束时关闭 或者,当需要执行文件输入/输出时,是否应使用std::i

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

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

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

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


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

我肯定喜欢
std::ifstream的本地临时实例
std::of流
。我甚至不确定它是否会起作用;开业
std::ofstream
清空现有文件的内容。只是寻找 从头开始,覆盖不会删除任何以前的内容, 如果更改的结果缩短了文件,您仍将被保留
使用早期内容中的剩余字符

我绝对喜欢
std::ifstream的本地临时实例
std::of流
。我甚至不确定它是否会起作用;开业
std::ofstream
清空现有文件的内容。只是寻找 从头开始,覆盖不会删除任何以前的内容, 如果更改的结果缩短了文件,您仍将被保留
使用早期内容中的剩余字符

当要重新写入的数据量与原始数据不同时,就地编辑文件是一件非常痛苦的事情。如果您的文件格式要求数据是连续的,并且没有孔的语法,那么除了重新写入文件(至少从修改位置开始)之外,您没有其他选择

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


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

当要重新写入的数据量与原始数据不同时,在适当位置编辑文件是一件非常痛苦的事情。如果您的文件格式要求数据是连续的,并且没有孔的语法,那么除了重新写入文件(至少从修改位置开始)之外,您没有其他选择

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

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