现在看来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个条目,从文件的开头搜索,并从文件末尾搜索.
最佳答案 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.