我有一个使用 stdio 来读取和写入二进制文件的程序。它会缓存当前流位置,并且如果读/写偏移量已经位于所需位置,则不会进行查找。
然而,一个有趣的问题出现了,那就是当读取一个字节并写入下一个字节时,它实际上并没有被写入!
这是重现该问题的程序:
#include <cstdio>
int main() {
FILE *f = fopen("test.bin", "wb");
unsigned char d[1024] = { 0 };
fwrite(d, 1, 1024, f);
fclose(f);
f = fopen("test.bin", "rb+");
for (size_t i = 0; i < 1024; i++) {
unsigned char a[1] = { 255 - (unsigned char)(i) };
fflush(f);
fwrite(a, 1, 1, f);
fflush(f);
fseek(f, i, SEEK_SET);
fread(a, 1, 1, f);
printf("%02X ", a[0]);
}
fclose(f);
return 0;
}
你应该看到它写入字节FF
向下00
,但是仅写入第一个字节,因为它不跟随fread
立即地。
如果它之前寻找fwrite
,它的行为正确。
该问题发生在 Visual Studio 2010/2012 和 TDM-GCC 4.7.1 (Windows) 上,然而它适用于codepad我猜这是因为它是在 Linux 上执行的。
知道为什么会发生这种情况吗?