`fwrite`在`fread`之后不能直接工作?

时间:2014-05-24 09:50:03

标签: c++ windows file-io stdio

我有一个程序,它使用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上执行

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:7)

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

  

“以更新模式打开文件时('+'作为第二个或第三个字符)   上面的模式参数值列表)[...]输入不应该直接跟随没有的输出   干预调用文件定位功能,除非输入操作遇到结束 -   的文件“。