2013-10-08 43 views
2
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个字节,而在他们之后没有其他东西。fread从空文件意外输出

+0

你检查过'feof()'和'ferror()'吗? – Mauren

+0

@Mauren在第一次调用fread()后返回一些正数。在写入6个字节之后,在读取10个字节的垃圾之后,feof返回0.也是0 – Qwerty

+0

奇怪。你是否在Notepad ++等编辑器中打开过这个文件来验证是否存在空格或控制字符? – Mauren

回答

4

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

要从fopen手册页引证:

当一个文件被打开与更新模式(“+”作为模式参数中的第二个或第三个字符),输入和输出可以执行上相关的流。但是,应用程序应确保输出不会直接跟随输入,而不需要插入fflush()或文件定位函数(fseek(),fsetpos()或rewind())的中间调用,并且输入不会紧跟在后面除非输入操作遇到文件结束,否则无需对文件定位功能进行干预调用。

fflushfwritefread调用应该解决您的问题之间。

0

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

+0

我在第一次fread后做了fseek,没有帮助,因为第一次fread返回0,在这种情况下,position没有改变。 – Qwerty