如何使用fseek()和fwrite()覆盖二进制文件中的单个字节?

时间:2011-11-27 13:58:07

标签: c++

我试图覆盖二进制文件中的单个字节。我正在使用fseek()将流位置指示器设置为我要覆盖的字节。然后我在fwrite()调用该位置的新字节。不知何故文件中的其他字节正在受到影响。下面是一些代码:

bool x = 1;
bool y = 0;
bool z = 1;

/* WRITE 101 to file */
FILE *ff = fopen(file, "wb");
fwrite(&x, sizeof(x), 1, ff);
fwrite(&y, sizeof(y), 1, ff);
fwrite(&z, sizeof(y), 1, ff);

fclose(ff);

bool x_r, y_r, z_r;

/* READ from file */
ff = fopen(file, "rb");
fread(&x_r, sizeof(x_r), 1, ff);
fread(&y_r, sizeof(y_r), 1, ff);
fread(&z_r, sizeof(z_r), 1, ff);

fclose(ff);

/* PRINT to standard output */
cout << x_r << y_r << z_r << endl; // OUTPUT: 101

bool overwrite = 1;

/* OVERWRITE */
ff = fopen(file, "wb");

fseek(ff, 1, SEEK_SET);
fwrite(&overwrite, sizeof(overwrite),1 , ff);
fclose(ff);


/* READ from file */
ff = fopen(file, "rb");
fread(&x_r, sizeof(x_r), 1, ff);
fread(&y_r, sizeof(y_r), 1, ff);
fread(&z_r, sizeof(z_r), 1, ff);

fclose(ff);

/* PRINT to standard output */
cout << x_r << y_r << z_r << endl; // OUPUT 011; I was expecting 111 

上面的代码基本上将三个字节的数据写入文件。 101.然后我使用fseek()设置重新定位流指示器以指向第二个字节。但是调用fwrite()来覆盖从0到1的第二个字节也会改变第一个字节。预期的输出是111,但我得到了011。

为什么会发生这种情况?我也尝试了putc,但这也没有用。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:5)

“r +”模式打开文件进行读写,但保留其内容。

答案 1 :(得分:1)

  1. 寻找您将要更新的位置字节
  2. 将文件的其余部分(不包括要更新的字节)保存到缓冲区或临时文件
  3. 附加一个带有最新值的字节
  4. 将内容附加到缓冲区或临时文件

答案 2 :(得分:0)

您必须打开追加的文件,而不是;即,

FILE *ff = fopen(file, "rb+");

只要打开文件,写入模式就会将文件截断为零长度。

答案 3 :(得分:0)

亚当斯评论是正确的。

“wb”完全取代了该文件。 由于你开始在位置1处写入,所以函数必须将某些东西放在位置0,所以它在那里放置一个NUL字节。

我同意您需要使用“r + b”

答案 4 :(得分:0)

1)使用fopen(filename,“r +”);
2)寻找字节的位置或使用fread直到找到字节
3)保存字节的偏移量 3)fseek(fileHandle,offset,SEEK_SET)
4)fwrite(addr_byte,1U,1U,fileHandle)