2008-09-22 63 views
7

該代碼當前執行此操作,並且fgetpos處理大於4GB的文件,但搜索返回錯誤,因此任何想法如何尋求到file > 4GB的結尾?確定大於4GB的文件的大小

fpos_t currentpos; 

sok=fseek(fp,0,SEEK_END); 
assert(sok==0,"Seek error!"); 

fgetpos(fp,&currentpos); 
m_filesize=currentpos; 
+0

只是出於好奇,如果你還沒有到文件末尾,你確定fgetpos工作正常嗎? – 2008-09-22 02:48:33

+0

fpos_t不是整數類型,所以最後一行無效。 – 2010-08-03 18:18:16

回答

0

在linux上,至少可以使用lseek64而不是fseek。

1

(從glibc的手冊被盜)

int fgetpos64 (FILE *stream, fpos64_t *position)

此功能類似於fgetpos但文件位置在類型fpos64_t到哪個位置的點的變量返回。

如果在32位機器上使用_FILE_OFFSET_BITS == 64編譯源代碼,則此功能可在名稱fgetpos下獲得,因此可以透明地替換舊接口。

1

Stat總是比fseek更好地確定文件大小,它會在不是文件的事情上安全地失敗。 64位文件大小是一個特定的操作,在gcc上,你可以在命令的末尾加上「64」,或者你可以強制它在默認情況下使所有的標準調用爲64。詳情請參閱您的編譯器手冊。

2

此代碼對我的作品在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; 
} 
7

忽略所有出現在其中的「64」的答案。在Linux上,您應該將-D_FILE_OFFSET_BITS=64添加到您的CFLAGS中,並使用fseekoftello函數,該函數取/返回off_t值而不是long。這些不是C的一部分,但POSIX。其他(非Linux)POSIX系統可能需要不同的選項來確保off_t是64位;檢查你的文件。

相關問題