2014-03-06 35 views

回答

3

fread函數fread返回實際讀取的字節數。因此,如果讀取的字節數少於要讀取的字節數,那麼您可能在文件末尾。

此外feof函數還會告訴你,如果你在文件的末尾。

要找出該文件的大小,而不實際讀取它:

long Size; 
    FILE *p; 
    p = fopen("filename.format","rb"); 
    fseek (p, 0 , SEEK_END); 
    Size = ftell (p) ; 
    rewind (p); 
+0

偉大的答案sir..genius – YakRangi

+0

根據標準「一個二進制流不需要 有意義地支持fseek調用,其值爲SEEK_END。」那麼這在一般情況下實際上起作用了嗎? – user673679

-1

在C++中,我通常跳到使用ifstream::seekg,並給它ios::end論據位置在文件的結尾。在ANSI-C等效的seekg

int fseek (FILE * stream, long int offset, int origin);

在哪裏origin可以SEEK_SET, SEEK_CUR, SEEK_END
嘗試,這將跳轉到該文件的末尾:

fseek(p, 0, SEEK_END);

然後,一旦在文件的結尾,只是用

long int ftell (FILE * stream);

告訴你的程序所在的文件結束。
舉一個例子,下面的代碼將設置size變量物理尺寸 - 字節 - 該文件,然後跳回文件的開頭:

 
FILE *p = fopen("filename.format", "rb"); // open binary file 

fseek(p, 0, SEEK_END); // jump to end of file 

long int size = ftell(p); // get size of file 

fseek(p, 0, SEEK_SET); // jump back to beginning of file 

+0

根據標準「一個二進制流不需要 有意義地支持fseek調用,其值爲SEEK_END。」那麼這在一般情況下實際上起作用了嗎? – user673679

+1

是的,如果你正在處理一個流(例如,一個linux'文件'設備或'stdin'),沒有明確的方式來告訴它的長度,因爲只要它被問到,它在技術上可以無限期地提供數據爲更多。由於這個問題特別針對文件,這個解決方案(和邁克爾的)一起工作。 – Codesmith