2013-01-02 51 views
0

因此,fread在Win7 x64上表現出色。Windows fread意外行爲

file = fopen(path, "rb"); 
fseek(file, 0, SEEK_END); 
fileSize = ftell(file); 
fseek(file, 0, SEEK_SET); 
buffer = malloc(fileSize); 
length = fread(buffer, fileSize, 1, file); 

的fread將返回1個字節作爲被讀取,而(FERROR和FEOF都返回0)

length = fread(buffer, 1, fileSize, file); 

的fread將返回相同的數讀爲檔案大小的字節。 MSDN說:「fread函數讀取從輸入流中計算大小字節的項目並將它們存儲在緩衝區中。」我認爲這意味着任何一段代碼都應該讀取相同數量的數據。有誰知道爲什麼fread沒有像我期望的那樣工作?

回答

2

他們確實讀取了相同數量的數據。讀取的字節數爲size參數乘以count參數。返回的是讀取的項目數量。

因此,在第一種情況下,您要求輸入1個大小爲fileSize的文件,並返回1. 在第二種情況下,您要求fileSize大小爲1的項目並返回fileSize。

+0

非常感謝你 – Matt

1

fread返回「實際讀取的完整項目數」,而不是讀取的字節數。

隨着fread(buffer, fileSize, 1, file);您正在閱讀的大小fileSize的一個項目(和fread將因此成功返回1),而與fread(buffer, 1, fileSize, file);你正在閱讀fileSize項目大小爲1,它將返回讀取的字節數(爲你」重新期待)。