FILE *hFile;
fopen_s(&hFile, "D:\\temp\\test.txt", "rb+");
char Buf[100];
int dwRead1 = fread(&Buf[0], sizeof(char), 10, hFile);
fwrite("Hello,", sizeof(char), 6, hFile);
int dwRead2 = fread(&Buf[0], sizeof(char), 10, hFile);
正如我猜测的那样,dwRead1为0.但是为什么dwRead2 = 10,而不是0?在Buf中我看到了垃圾,虽然我只写了6个字节,然后就没有了。
答案 0 :(得分:4)
您正在观察未定义的行为。
引用fopen
手册页:
当使用更新模式打开文件时('+'作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,应用程序应确保输出不直接跟随输入,而无需调用fflush()或文件定位函数(fseek(),fsetpos()或rewind()),并且输入不会直接跟随除非输入操作遇到文件结尾,否则输出时不会调用文件定位功能。
在fflush
和fwrite
来电之间设置fread
可以解决您的问题。
答案 1 :(得分:0)
你需要从文件的开头调用fseek(hFile,0,SEEK_SET)来读取“Hello”(如果它当然是空的)。 这一切都发生了,因为fwrite(..)和fread()改变了流hFile的位置指示符,fread正试图在这种情况下从流的末尾读取。