我想用我自己的函數從文件中獲取文件大小。我將使用它來爲數據結構分配內存來保存文件上的信息。自制fstat獲取文件大小,總是返回0長度
的文件大小的功能如下:
long fileSize(FILE *fp){
long start;
fflush(fp);
rewind(fp);
start = ftell(fp);
return (fseek(fp, 0L, SEEK_END) - start);
}
任何想法,我做錯了什麼嗎?
我想用我自己的函數從文件中獲取文件大小。我將使用它來爲數據結構分配內存來保存文件上的信息。自制fstat獲取文件大小,總是返回0長度
的文件大小的功能如下:
long fileSize(FILE *fp){
long start;
fflush(fp);
rewind(fp);
start = ftell(fp);
return (fseek(fp, 0L, SEEK_END) - start);
}
任何想法,我做錯了什麼嗎?
隨你期待在這裏的
fseek(fp, 0L, SEEK_END);
return (ftell(fp) - start);
代替
return (fseek(fp, 0L, SEEK_END) - start);
因爲fseek成功歸零不偏移。
幾點意見:
不叫fflush()
- 您的流可能是讀流,這fflush()
結果不確定的行爲
你沒有任何錯誤檢查!
fseek()
返回0成功 - 你需要調用ftell()
拿到長度
更改代碼這樣:
long fileSize(FILE *fp)
{
fseek(fp, 0L, SEEK_END);
return ftell(fp);
}
好的建議,我會帶他們一起。謝謝。 – Fred 2010-03-27 08:46:27
您需要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);
}
此外,請確保您以二進制模式打開您的文件。
太好了,我不知道你可以做到這一點。謝謝! – Fred 2010-03-27 08:51:56
謝謝。 *我想我應該花更多時間閱讀手冊頁。 :) – Fred 2010-03-27 08:44:05