fseek现在支持大文件

时间:2011-07-07 19:25:12

标签: c++ 64-bit large-files fseek

现在看来,至少在我的实现中,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;
}

上面的代码以二进制size_t格式写入一个大文件,条目为1-10 ^ 9。 然后写入最后10个条目,从文件的开头搜索,并从文件末尾搜索。

3 个答案:

答案 0 :(得分:1)

Linux x86-64几天来就有大文件支持(LFS);并且不需要任何特殊的宏等来启用它 - 传统的fseek())和LFS fseek64()已经使用64位off_t

Linux i386(32位)通常默认为32位off_t,否则会破坏大量应用程序 - 但您可以通过检查{{1}的值来测试环境中定义的内容}宏。

有关Linux大文件支持的完整详细信息,请参阅http://www.suse.de/~aj/linux_lfs.html

答案 1 :(得分:1)

签名是

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

所以范围取决于long的大小。

在某些系统上它是32位的,你有大文件的问题,在其他系统上它是64位。

答案 2 :(得分:0)

999999990是一个普通的int,完全符合32位。我不相信你会逃避这个:

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