一尘不染

在Linux C ++应用程序中查找和读取大文件

linux

我使用G ++中的标准 ftellfseek 选项 遇到 整数溢出,但是我想我错了,因为似乎 ftell64fseek64
不可用。我一直在搜索,很多网站似乎都使用 lseekoff64_t 数据类型进行引用,但是我还没有找到任何引用等于 fseek的
示例。现在,我正在读取的文件是16GB + CSV文件,期望至少翻倍。

没有任何外部库,最简单的方法来实现与 fseek / ftell 对相似的结构?我的应用程序现在可以使用用于4.x的标准GCC / G ++库工作。


阅读 353

收藏
2020-06-02

共1个答案

一尘不染

fseek64是C函数。为了使它可用,您必须在包含系统头文件之前定义_FILE_OFFSET_BITS =
64,这将或多或少地将fseek定义为实际的fseek64。或者在编译器参数中执行此操作,例如gcc -D_FILE_OFFSET_BITS =
64…。

http://www.suse.de/~aj/linux_lfs.html在linux上对大文件的支持有很大的优势:

  • 使用“ gcc -D_FILE_OFFSET_BITS = 64”编译程序。这将强制所有文件访问调用使用64位变体。几种类型也发生变化,例如off_t变为off64_t。因此,务必始终使用正确的类型,并且不要使用例如int而不是off_t。为了在其他平台上具有可移植性,您应该使用getconf LFS_CFLAGS,它将在Linux平台上返回-D_FILE_OFFSET_BITS = 64,但在Solaris上可能返回其他内容。对于链接,应该使用通过getconf LFS_LDFLAGS报告的链接标志。在Linux系统上,您不需要特殊的链接标志。
  • 定义_LARGEFILE_SOURCE和_LARGEFILE64_SOURCE。使用这些定义,您可以直接使用像open64这样的LFS函数。
  • 将O_LARGEFILE标志与open一起使用可对大文件进行操作。
2020-06-02