"fwrite"在"fread"之后不起作用?

`fwrite` doesn't work directly after `fread`?

本文关键字:不起作用 之后 fread fwrite      更新时间:2023-10-16

我有一个使用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上执行。

知道为什么会这样吗?

C99§7.18.5.3/6(引自N869最终稿):

“当以更新模式打开文件时(' + '作为字符的第二个或第三个字符)(以上模式参数值列表)[…]输入不能直接跟在没有对文件定位函数的中间调用,除非输入操作遇到end-文件.”