我试图覆盖二进制文件中的单个字节。我正在使用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,但这也没有用。任何帮助将不胜感激。
答案 0 :(得分:5)
“r +”模式打开文件进行读写,但保留其内容。
答案 1 :(得分:1)
答案 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)