C ++:使用fstream修补二进制文件

时间:2011-03-07 00:35:11

标签: c++

我有一个已创建的巨大文件。我需要在文件的开头写一些数据,同时保留文件的其他内容。以下代码会破坏现有文件。任何人都可以用正确的方法帮助我。

 ofstream oFile(FileName,ios::out|ios::binary);  
 oFile.seekp(0);  
 oFile.write((char*)&i,sizeof(i));       
 oFile.write((char*)&j,sizeof(i));
 oFile.close();

编辑: 基本上我想在不同的位置覆盖已经存在的文件的一些字节,包括start。我知道要写入的位置的字节地址。我的写不会改变文件大小。

我需要做一些与以下代码相同的工作:

int  mode = O_RDWR;
int myFilDes = open (FileName, mode, S_IRUSR | S_IWUSR);
lseek (myFilDes, 0, SEEK_SET);
write (myFilDes, &i, sizeof (i));
write (myFilDes, &j, sizeof (j));

3 个答案:

答案 0 :(得分:3)

你应该执行:

 oFile.seekp(0);

执行写入之前。 ios :: ate意味着你要附加到文件中。

您还需要使用ios :: in而不是ios :: out。 ios :: out意味着你计划截断文件,这可能会产生无意义的后果。

这不直观

答案 1 :(得分:1)

您缺少ios::in

使用:

ofstream oFile(FileName,ios::out|ios::in|ios::binary);

答案 2 :(得分:0)

如果你想“插入”,你必须知道C ++看到的“文件”就像一个字节流...所以如果你有它:

| 1 | 5 | 10 | 11 | 2 | 3 |

你想在第一个位置插入数据(将你的位置设置为0),你将不得不移动文件的其余部分......