2011-07-07 74 views
4

看來fseek現在至少在我的實現中,自然支持大文件而沒有fseek64,lseek或一些奇怪的編譯器宏。fseek現在支持大文件

這是什麼時候發生的?

#include <cstdio> 
#include <cstdlib> 
void writeF(const char*fname,size_t nItems){ 
    FILE *fp=NULL; 
    if(NULL==(fp=fopen(fname,"w"))){ 
    fprintf(stderr,"\t-> problems opening file:%s\n",fname); 
    exit(0); 
    } 
    for(size_t i=0;i<nItems;i++) 
    fwrite(&i,sizeof(size_t),1,fp); 
    fclose(fp); 
} 
void getIt(const char *fname,size_t offset,int whence,int nItems){ 
    size_t ary[nItems]; 
    FILE *fp = fopen(fname,"r"); 
    fseek(fp,offset*sizeof(size_t),whence); 
    fread(ary,sizeof(size_t),nItems,fp); 

    for(int i=0;i<nItems;i++) 
    fprintf(stderr,"%lu\n",ary[i]); 
    fclose(fp); 
} 


int main(){ 
    const char * fname = "temp.bin"; 
    writeF(fname,1000000000);//writefile 
    getIt(fname,999999990,SEEK_SET,10);//get last 10 seek from start 
    getIt(fname,-10,SEEK_END,10);//get last 10 seek from start 
    return 0; 
} 

上面的代碼使用二進制size_t格式的條目1-10^9寫入一個大文件。 然後寫入最後10個條目,從文件的開始處尋找,並從文件末尾查找。

+2

我以爲fseek只能達到2GB,但在這裏我看不到2GB的文件。 – 2011-07-07 19:28:45

+1

@monkeyking - IOW,1000000000 = 1,000,000,000和999999990 = 999,999,990,這兩個都不是> 2GB – KevinDTimm

+0

此外,您沒有提及平臺...呃 – sehe

回答

0

999999990是一個正常的int,完全符合32位。我不相信你會逃脫這個:

getIt(fname,99999999990LL,SEEK_SET,10); 
1

Linux x86-64已經從第一天開始就有很大的文件支持(LFS)並且不需要任何特殊的宏來啓用它 - 傳統的fseek())和LFS fseek64()都已經使用64位的off_t

Linux i386(32位)通常默認爲32位off_t,否則會破壞大量應用程序 - 但您可以通過檢查_FILE_OFFSET_BITS宏的值來測試環境中定義的內容。

有關Linux大文件支持的完整詳細信息,請參閱http://www.suse.de/~aj/linux_lfs.html

1

簽名是

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

所以範圍取決於long大小。

在某些系統上它是32位的,並且在其他系統上它是64位時遇到大文件的問題。