【问题标题】:`fwrite` doesn't work directly after `fread`?`fwrite` 在`fread` 之后不能直接工作?
【发布时间】:2014-07-13 15:51:42
【问题描述】:

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

知道为什么会这样吗?

【问题讨论】:

  • 你知道什么是缓冲写入,fflush() 是干什么用的?
  • @πάνταῥεῖ 是的,实际上我已经尝试过冲洗,但它仍然不起作用。我会更新问题
  • 为什么对这个问题投反对票?请问下投票者可以回答吗?
  • 他问了六分钟后就把它扔到了休息室。

标签: c++ windows file-io stdio


【解决方案1】:

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

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

【讨论】:

  • 感谢您深入了解规范,这说明了一切。
猜你喜欢
  • 2015-08-12
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多