c++ - fseek 现在支持大文件

标签 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 个条目,从文件开头查找,并从文件末尾查找。

最佳答案

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

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

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

关于c++ - fseek 现在支持大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615953/

相关文章:

winforms - 基于 Microsoft Visual C++ Express 2010 的 64 位构建

c++ - 基本数学函数的意外值

c++ - 窗口不断获取 WM_WINDOWPOSCHANGING

java - 如何在 Java 中处理 128 位小端乘法而不求助于 BigInteger

java - 如何在 x64 操作系统上使用 JVM 客户端模式?

c# - 将大文件写入磁盘内存不足异常

c++ - 什么是 _WIN32_WINNT,它是如何工作的?

c++ - 如何删除传播或检测到的对象?

R:巨大(> 20GB)文件的xmlEventParse期间的内存管理

python - 如何提高 Python 在大文件上的迭代性能