c++覆盖文件数据?

标签 c++ file-io

我正在尝试运行一个程序来替换文件中的某些数据。试图替换的文件的相关部分如下所示:

1 Information 15e+10

2 Information 2e+16

3 Information 6e+2

等等。

有问题的文件在几千兆字节范围内可能非常大,据我所知,因为使用整个文件的缓冲区并重写整个文件是不可能/不合理的。好吧,这很好,我只想替换值(例如 15e+10)。

这一切都适用于简单的 ios::in|ios::outtellp() 如果我用类似大小的值替换值(15e+10->12e+12) 或者即使它的尺寸更小,因为我可以简单地添加一个可以忽略的额外空间(例如 15e +10->4e+10)。但是如果我需要用一个长度比文件中已有的长度长的值替换该值,我就会遇到问题(例如 6e+2->16e+10) 它将覆盖换行符或开始覆盖下一行的信息。

我在论坛上搜索过,每个人都说您可以在文件中覆盖,可以追加到文件末尾,或者可以缓冲并重新创建整个文件。无论如何,我是否可以实现正确覆盖值而无需重新创建文件的目标?

如果没有,那么如果有问题的多个文件对于内存来说太大了,我怎么能打开 2 个文件(1 个输入 1 个输出)来执行此操作?

注意:我还想避免使用 boost::,因为我需要能够在没有 boost 图书馆。

最佳答案

打开一个流以从输入 (IN) 文件中读取,并打开第二个流 (OUT) 以写入一个新的输出 (tmp) 文件。

从 IN 读取并写入 OUT。当您从 IN 获得一个您想要替换的值时,将替换写入 OUT 而不是您从 IN 获得的值。

解析完成后,将第一个文件替换为第二个 (tmp) 文件。

这对你有用吗?

关于c++覆盖文件数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19249122/

相关文章:

c++ - OpenCV 错误 : Assertion failed in cvAdaptiveThreshold

file-io - 如果 Groovy 中不存在则创建文件

file-io - Spark 指标错误 : CsvReporter: Error writing to jvm. PS-MarkSweep.count

c++ - pow() 返回 0 (C++)

c++ - 如何使用 C++ 构造函数初始化位域?

c - 使用fseek读写文件,读取数据错误

c# - 为什么复制到U盘时文件修改时间自动增加2秒?

matlab - 将 matlab 输出保存在文本文件中

c++ - 为什么内联函数需要传递参数?

c++ - 使用空的 weak_ptr 作为参数调用 map::count 是否安全?