Alv*_*ong 1 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;
}
Run Code Online (Sandbox Code Playgroud)
你应该看到它写字节FF下来00,但只有第一个字节写入,因为它不遵循fread马上.
如果它以前寻求fwrite,它会正确行动.
问题发生在Visual Studio 2010/2012和TDM-GCC 4.7.1(Windows)上,但它适用于键盘,我想这是因为它在Linux上执行.
知道为什么会这样吗?
C99§7.18.5.3/ 6(引自N869最终草案):
"当使用更新模式打开文件时('+'作为上述模式参数值列表中的第二个或第三个字符)[...]输入不应直接跟随输出而不干预对文件定位功能的调用,除非输入操作遇到文件结尾."
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |