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

Rak*_*ary 2 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 
Run Code Online (Sandbox Code Playgroud)

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

任何想法为什么会这样?我也尝试了putc,但这也没有用.任何帮助,将不胜感激.

zvr*_*rba 5

"r +"模式打开文件进行读写,但保留其内容.

  • 更具体地说,"w +"`截断文件的内容,而`"r +"`则不截断.当你试图在空文件中偏移1并写入一个字节时,该字节被写入,并且那里的字节被填零,所以最终得到两字节文件"00 01".由于OP正在写二进制数据,OP应该使用开放模式"r + b"`. (3认同)