C++ 覆盖文件数据

c++ overwriting file data?

本文关键字:数据 文件 覆盖 C++      更新时间:2023-10-16

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

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( 文件。

这对你有用吗?

使用 lseek((/fseek(( "跳转"到文件中的给定位置。

您可以使用

seekp转到该位置并使用<<重写它

例:

示例.txt ( |?| = 1 字节的数据(

|A|B|C||1|2|3|D|E|F||4|5|6|

//Somewhere in the code
fstream file;
open("example.txt");
//Somehow find the character distance and store it into "distance"
seekp(distance);//If distance = 0, it will go to "A" like rewind() but easier for me

如果距离为 4,则下一个字符将被覆盖1

file << "987";

文件将是

|A|B|C||9|8|7|D|E|F||4|5|6|

但是这里唯一的问题是当您需要增加/减小大小时:

增加:

您将覆盖另一个字符,因此您需要创建一个临时字符串来存储其余数据,或者如果数据太大,则将其分成较小的块,例如

|A|B|C||9|8|7|D|E|F||4|5|6|

string tempstring;
seekp(distance);
file >> tempstring;
seekp(distance);
file << content << tempstring;  //content is the data

减少:

最简单的解决方案是将 NULL 字符写入多余的空间,例如

|A|B|C||1|\0|\0|D|E|F||4|5|6|

唯一的副作用是文件大小与以前相同