該代碼當前執行此操作,並且fgetpos處理大於4GB的文件,但搜索返回錯誤,因此任何想法如何尋求到file > 4GB
的結尾?確定大於4GB的文件的大小
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
該代碼當前執行此操作,並且fgetpos處理大於4GB的文件,但搜索返回錯誤,因此任何想法如何尋求到file > 4GB
的結尾?確定大於4GB的文件的大小
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
如果你在Windows中,你要GetFileSizeEx (MSDN)。返回值是一個64位整數。
在linux上stat64 (manpage)是正確的。 fstat如果你正在使用FILE *。
在linux上,至少可以使用lseek64而不是fseek。
(從glibc的手冊被盜)
int fgetpos64 (FILE *stream, fpos64_t *position)
此功能類似於fgetpos但文件位置在類型fpos64_t
到哪個位置的點的變量返回。
如果在32位機器上使用_FILE_OFFSET_BITS == 64
編譯源代碼,則此功能可在名稱fgetpos
下獲得,因此可以透明地替換舊接口。
Stat總是比fseek更好地確定文件大小,它會在不是文件的事情上安全地失敗。 64位文件大小是一個特定的操作,在gcc上,你可以在命令的末尾加上「64」,或者你可以強制它在默認情況下使所有的標準調用爲64。詳情請參閱您的編譯器手冊。
此代碼對我的作品在Linux中:
int64_t bigFileSize(const char *path)
{
struct stat64 S;
if(-1 == stat64(path, &S))
{
printf("Error!\r\n");
return -1;
}
return S.st_size;
}
忽略所有出現在其中的「64」的答案。在Linux上,您應該將-D_FILE_OFFSET_BITS=64
添加到您的CFLAGS中,並使用fseeko
和ftello
函數,該函數取/返回off_t
值而不是long
。這些不是C的一部分,但POSIX。其他(非Linux)POSIX系統可能需要不同的選項來確保off_t
是64位;檢查你的文件。
只是出於好奇,如果你還沒有到文件末尾,你確定fgetpos工作正常嗎? – 2008-09-22 02:48:33
fpos_t不是整數類型,所以最後一行無效。 – 2010-08-03 18:18:16