4

少なくとも私の実装では、fseek は現在、fseek64、lseek、またはいくつかの奇妙なコンパイラ マクロを使用せずに、大きなファイルを自然にサポートしているようです。

これはいつ起こったのですか?

#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;
}

上記のコードは、1 ~ 10^9 のエントリを含む大きなファイルをバイナリ size_t 形式で書き込みます。次に、最後の 10 エントリを書き込み、ファイルの先頭からシークし、ファイルの最後からシークします。

4

3 に答える 3

1

Linux x86-64 はほぼ初日から大きなファイルのサポート (LFS) を備えていました。それを有効にするために特別なマクロなどは必要ありません-従来の両方fseek())とLFSfseek64()はすでに64ビットを使用していますoff_t

Linux i386 (32 ビット) は通常、デフォルトで 32 ビットに設定さoff_tれています。そうしないと、膨大な数のアプリケーションが機能しなくなるためです。ただし、_FILE_OFFSET_BITSマクロの値を確認することで、環境で定義されている内容をテストできます。

Linux の大きなファイルのサポートの詳細については、http://www.suse.de/~aj/linux_lfs.htmlを参照してください。

于 2011-07-07T19:48:30.713 に答える
1

サインは

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

したがって、範囲は のサイズに依存しますlong

一部のシステムでは 32 ビットであり、大きなファイルに問題があり、他のシステムでは 64 ビットです。

于 2011-07-07T20:13:14.723 に答える
0

999999990は通常の int で、32 ビットに完全に適合します。私はあなたがこれでうまくいくとは思わない:

getIt(fname,99999999990LL,SEEK_SET,10);
于 2011-07-07T19:27:41.580 に答える