2011-07-07 22 views
4

少なくとも私の実装では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相当のファイルが表示されません。 –

+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ビットです。

関連する問題