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

Joh*_*one 14 c c++ linux gnu large-files

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

没有任何外部库,实现与fseek/ftell对类似的结构最简单的方法是什么?我的应用程序现在使用4.x的标准GCC/G ++库.

nos*_*nos 27

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标志来操作大文件.


mar*_*k4o 10

如果您想坚持使用ISO C标准接口,请使用fgetpos()fsetpos().但是,这些功能仅对保存文件位置以及稍后返回相同位置有用.它们表示使用类型的位置fpos_t,不需要是整数数据类型.例如,在基于记录的系统上,它可以是包含记录中的记录号和偏移量的结构.这可能太限制了.

POSIX定义的功能ftello()fseeko(),其表示使用的位置off_t类型.这必须是整数类型,并且该值是从文件开头偏移的字节.您可以对其执行算术,并可用于fseeko()执行相对搜索.这适用于Linux和其他POSIX系统.

另外,用-D_FILE_OFFSET_BITS=64(Linux/Solaris)编译.这将定义off_t为64位类型(即off64_t)而不是long,并将使用文件偏移的函数重新定义为采用64位偏移的版本.在编译64位时这是默认设置,因此在这种情况下不需要.


Luc*_*eis 5

fseek64() 不是标准的,编译器文档应该告诉你在哪里找到它.

您是否尝试过fgetposfsetpos?它们是为大文件设计的,实现通常使用64位类型作为fpos_t的基础.


Voi*_*oid 5

您是否尝试将_FILE_OFFSET_BITS预处理器符号设置为64的fseeko()

这将为您提供类似fseek()的接口,但其偏移参数类型为off_t而不是long.设置_FILE_OFFSET_BITS = 64将使off_t成为64位类型.

同样适用于ftello().