2010-03-27 95 views
4

我想用我自己的函數從文件中獲取文件大小。我將使用它來爲數據結構分配內存來保存文件上的信息。自制fstat獲取文件大小,總是返回0長度

的文件大小的功能如下:

long fileSize(FILE *fp){ 
    long start; 
    fflush(fp); 
    rewind(fp); 
    start = ftell(fp); 
    return (fseek(fp, 0L, SEEK_END) - start); 
} 

任何想法,我做錯了什麼嗎?

回答

3

隨你期待在這裏的

fseek(fp, 0L, SEEK_END); 
return (ftell(fp) - start); 

代替

return (fseek(fp, 0L, SEEK_END) - start); 

因爲fseek成功歸零不偏移。

+0

謝謝。 *我想我應該花更多時間閱讀手冊頁。 :) – Fred 2010-03-27 08:44:05

1

幾點意見:

  • 不叫fflush() - 您的流可能是讀流,這fflush()結果不確定的行爲

  • 你沒有任何錯誤檢查!

  • fseek()返回0成功 - 你需要調用ftell()拿到長度

更改代碼這樣:

long fileSize(FILE *fp) 
{  
    fseek(fp, 0L, SEEK_END); 
    return ftell(fp); 
} 
+1

好的建議,我會帶他們一起。謝謝。 – Fred 2010-03-27 08:46:27

0

您需要fseek之後調用ftell。嘗試:

long fileSize(FILE *fp){ 
    long start; 
    fflush(fp); 
    rewind(fp); 
    start = ftell(fp); 
    fseek(fp, 0L, SEEK_END); 
    return ftell(fp); 
} 

有沒有必要做一個區別,所以你的第一個ftell是無用的,你可以擺脫它。我會用:

long filezise(FILE *fp) 
{ 
    fseek(fp,OL,SEEK_END); 
    // fseek(f, 0, SEEK_SET); - only if you want to seek back to the beginning 
    return ftell(fp); 
} 

此外,請確保您以二進制模式打開您的文件。

+0

太好了,我不知道你可以做到這一點。謝謝! – Fred 2010-03-27 08:51:56