我正在尝试运行一个程序来替换文件中的某些数据。试图替换的文件的相关部分如下所示:
1 Information 15e+10
2 Information 2e+16
3 Information 6e+2
等等。
有问题的文件在几千兆字节范围内可能非常大,据我所知,因为使用整个文件的缓冲区并重写整个文件是不可能/不合理的。好吧,这很好,我只想替换值(例如 15e+10
)。
这一切都适用于简单的 ios::in|ios::out
和 tellp()
如果我用类似大小的值替换值(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/