首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fseek现在支持大文件

fseek现在支持大文件
EN

Stack Overflow用户
提问于 2011-07-08 03:25:12
回答 3查看 10.4K关注 0票数 4

似乎fseek现在,至少在我的实现中,自然支持大文件,没有fseek64,lseek或一些奇怪的编译器宏。

这是什么时候发生的?

代码语言:javascript
复制
#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个条目,从文件的开头开始查找,并从文件的末尾查找。

EN

回答 3

Stack Overflow用户

发布于 2011-07-08 03:48:31

Linuxx86-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
EN

Stack Overflow用户

发布于 2011-07-08 04:13:15

签名是

代码语言:javascript
复制
int fseek ( FILE * stream, long int offset, int origin );

因此,范围取决于long的大小。

在某些系统上,它是32位的,并且在处理大文件时会有问题,而在其他系统上,它是64位。

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 03:27:42

999999990是一个普通的整数,非常适合32位。但我不相信你能逃脱惩罚:

代码语言:javascript
复制
getIt(fname,99999999990LL,SEEK_SET,10);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6615953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档