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

我正在使用G ++中的标准ftellfseek选项运行到整数溢出,但我想我错了,因为似乎ftell64fseek64不可用。 我一直在寻找和许多网站似乎引用使用lseekoff64_t数据types,但我还没有find任何引用的东西等于fseek的例子。 目前我正在阅读的文件是16GB + CSV文件,预计至less会翻一番。

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

fseek64是一个C函数。 为了使它可用,你必须在包含系统头文件之前定义_FILE_OFFSET_BITS = 64这或多或less地将fseek定义为fseek64。 或者在编译器参数中执行,例如gcc -D_FILE_OFFSET_BITS = 64 ….

http://www.suse.de/~aj/linux_lfs.html对linux上的大文件支持有很好的覆盖:;

  • 用“gcc -D_FILE_OFFSET_BITS = 64”编译你的程序。 这将强制所有文件访问调用使用64位变体。 几种types也改变,例如off_t变成off64_t。 因此,总是使用正确的types非常重要,不要使用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标志来操作大文件。

如果你想坚持ISO C标准接口,使用fgetpos()fsetpos() 。 但是,这些function仅用于保存文件位置并稍后返回到相同的位置。 它们使用typesfpos_t来表示位置,不需要是整型数据types。 例如,在基于logging的系统上,它可能是一个包含logging中的logging号和偏移量的结构。 这可能太有限制了。

POSIX定义了函数ftello()fseeko() ,它们使用off_ttypes来表示位置。 这需要是一个整数types,并且该值是从文件开头的字节偏移量。 您可以对其执行算术运算,并可以使用fseeko()来执行相对查找。 这将在Linux和其他POSIX系统上工作。

另外,使用-D_FILE_OFFSET_BITS=64 (Linux / Solaris)进行编译。 这将定义off_t为64位types(即off64_t )而不是long ,并将使用文件偏移的函数重新定义为使用64位偏移量的版本。 这是64位编译时的默认值,所以在这种情况下不需要。

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

你有没有试过fgetposfsetpos ? 它们是为大文件devise的,实现通常使用64位types作为fpos_t的基础。

你有没有尝试与_FILE_OFFSET_BITS预处理器符号设置为64 fseeko()

这将给你一个类似于fseek()的接口,但是使用types为off_t的偏移参数而不是long 。 设置_FILE_OFFSET_BITS = 64会使off_t成为一个64位的types。

对于ftello()也是一样的

使用fsetpos(3)fgetpos(3) 。 他们使用fpos_t数据types,我相信这是保证能够保持至less64位。