正确选择文件流对象
Proper choice of file stream objects
应用程序使用RapidXML编辑XML文件。编辑不是自动的,偶尔也会发生:XML内容显示在GUI中,用户执行一些更改XML的操作。每个更改都必须立即保存到磁盘。
加载RapidXML文档对象需要将文件的内容复制到字符串中。文档中的每一次更改都会将文档对象的内容复制回文件中。
在本例中,文件同时用于输入和输出在这种情况下,是否应将单个std::fstream
对象用于所有输入/输出操作?它将在应用程序启动时打开一次,用于输入/输出,并在应用程序结束时关闭。
或者,当需要执行文件输入/输出时,是否应使用std::ifstream
和std::ofstream
的本地(临时)实例?例如,在开始读取文件时使用的std::ifstream
(打开、读取、关闭);类似地,每当DOM必须导出到文件(打开、写入、关闭)时,都要使用std::ofstream
实例。
我不关心这里的性能(由于应用程序的性质),但很好奇在这种情况下文件流对象的正确选择。
当要重写的数据量与原始数据不同时,就地编辑文件是一件非常痛苦的事情。如果您的文件格式要求数据按顺序,并且没有孔的语法,那么您实际上别无选择,只能重写文件(至少从修改位置开始)。
此外,还有其他限制。如果在继续之前需要将数据刷新到磁盘,则可以使用单个std::fstream
进行多次编辑。即使在文件流上调用flush()
方法,操作系统通常也不会将文件刷新到磁盘。有些平台提供了不可移植的解决方案来真正强制写入。因此,如果您需要将其刷新到磁盘,最好的办法是实际关闭该文件。
因此,特别是对于关键应用程序,我建议使用第二种方法(初始加载时为ifstream
,每次写入时为ofstream
)。我还建议写入一个临时文件,然后将整个重写移到首选位置,替换原始文件。这可以确保您不会有任何数据丢失(至少在提供原子文件移动的系统上是这样)。
我肯定更喜欢std::ifstream
和CCD_ 11。我甚至不确定它是否会起作用;打开std::ofstream
清空现有文件的内容。只是在寻找从头开始,重写不会删除任何以前的内容,如果更改的结果缩短了文件,则仍然会留下带有早期内容中的剩余字符。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在h文件中包含.o对象文件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 从对象文件(.o)在macos上制作归档文件(.a文件)
- 检测 COFF 对象文件中C++内联符号
- 特定对象文件的单线程生成
- 使用对象文件读取三角形数据网格
- 链接时,不同静态库中的同一对象文件
- 防止临时对象文件访问 MSVC 中的磁盘
- 对在不同二进制文件中创建的对象文件的依赖关系
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 使用 make 将对象文件放在特定目录中
- 如何从 3d 对象文件中获取 3d 坐标
- 为什么我的生成文件没有生成对象文件?
- 如何在OSX上正确创建C++对象文件(.o)
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 使用nvcc(CUDA-RINSIDE)正确链接对象文件
- 链接节点本机模块中的提升库,对象文件需要替代库版本