从空文件中发送意外输出

时间:2013-10-08 13:57:29

标签: c file

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个字节,然后就没有了。

2 个答案:

答案 0 :(得分:4)

您正在观察未定义的行为。

引用fopen手册页:

  

当使用更新模式打开文件时('+'作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,应用程序应确保输出不直接跟随输入,而无需调用fflush()或文件定位函数(fseek(),fsetpos()或rewind()),并且输入不会直接跟随除非输入操作遇到文件结尾,否则输出时不会调用文件定位功能。

fflushfwrite来电之间设置fread可以解决您的问题。

答案 1 :(得分:0)

你需要从文件的开头调用fseek(hFile,0,SEEK_SET)来读取“Hello”(如果它当然是空的)。 这一切都发生了,因为fwrite(..)和fread()改变了流hFile的位置指示符,fread正试图在这种情况下从流的末尾读取。