"fwrite"在"fread"之后不起作用?
`fwrite` doesn't work directly after `fread`?
我有一个使用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-文件.”
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 我的程序在SCANF语句之后不起作用
- OpenCV Canny 之后的 ConvexPoly 不起作用
- 我的 for 循环之后的代码不起作用,for 循环后的打印语句不会被打印
- % 在 rand() c++ 之后不起作用
- 字符串运算符 += 有时在 string::resize() 之后不起作用
- setOverrideCursor(Qt::WaitCursor) 如果在消息框之后调用,则不起作用
- 在 msgget() 之后,cout 或 printf 不起作用
- 为什么你完成我在点之后不起作用
- 在 Ctrl+Z (EOF) 之后从 iostream::cin 恢复读取?("ignore"不起作用)
- cout/stdout在execvp()之后不起作用
- 在C++中读取一行之后的行不起作用
- 为什么我的第一个 if 语句有效,但我的 else if 语句在它之后不起作用
- 为什么 exec() 在 chroot() 之后不起作用?
- "fwrite"在"fread"之后不起作用?
- cin.getline() 在 cin 之后不起作用