在Linux C ++应用程序中寻找和读取大文件
我正在使用G ++中的标准ftell和fseek选项运行到整数溢出,但我想我错了,因为似乎ftell64和fseek64不可用。 我一直在寻找和许多网站似乎引用使用lseek与off64_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_t
types来表示位置。 这需要是一个整数types,并且该值是从文件开头的字节偏移量。 您可以对其执行算术运算,并可以使用fseeko()
来执行相对查找。 这将在Linux和其他POSIX系统上工作。
另外,使用-D_FILE_OFFSET_BITS=64
(Linux / Solaris)进行编译。 这将定义off_t
为64位types(即off64_t
)而不是long
,并将使用文件偏移的函数重新定义为使用64位偏移量的版本。 这是64位编译时的默认值,所以在这种情况下不需要。
fseek64()
不是标准的,编译器文档应该告诉你在哪里find它。
你有没有试过fgetpos
和fsetpos
? 它们是为大文件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位。