2013-10-08 64 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