C++ 在Linux C++;应用

C++ 在Linux C++;应用,c++,c,linux,gnu,large-files,C++,C,Linux,Gnu,Large Files,我在使用G++中的标准ftell和fseek选项时遇到了整数溢出,但我想我弄错了,因为ftell64和fseek64似乎不可用。我一直在搜索,很多网站似乎都引用了带有off64_t数据类型的lseek,但我没有找到任何引用与fseek相同的内容的示例。目前,我正在读取的文件是16GB+CSV文件,预计至少是16GB+CSV文件的两倍 如果没有任何外部库,实现类似于fseek/ftell对的结构的最简单方法是什么?我的应用程序现在使用4.x的标准GCC/G++库工作。fseek64()不是标准的,

我在使用G++中的标准ftell和fseek选项时遇到了整数溢出,但我想我弄错了,因为ftell64和fseek64似乎不可用。我一直在搜索,很多网站似乎都引用了带有off64_t数据类型的lseek,但我没有找到任何引用与fseek相同的内容的示例。目前,我正在读取的文件是16GB+CSV文件,预计至少是16GB+CSV文件的两倍

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

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


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

fseek64是一个C函数。要使其可用,您必须先定义_FILE_OFFSET_BITS=64,然后再包括或多或少将fseek定义为实际fseek64的系统头。或者在编译器参数中执行此操作,例如。 gcc-D_文件_偏移量_位=64

在linux上有大量的大文件支持:

  • 使用“gcc-D_FILE_OFFSET_BITS=64”编译程序。这将强制所有文件访问调用使用64位变体。有几种类型也会发生变化,例如off\u t变为off64\u t。因此,务必使用正确的类型,不要使用int而不是off\t。为了便于与其他平台进行移植,您应该使用getconf LFS\u CFLAGS,它在Linux平台上将返回-D_FILE\u OFFSET\u BITS=64,但在Solaris等平台上可能会返回其他内容。对于链接,应该使用通过getconf LFS\u LDFLAGS报告的链接标志。在Linux系统上,不需要特殊的链接标志
  • 定义_LARGEFILE_源和_LARGEFILE64_源。通过这些定义,您可以直接使用像open64这样的LFS函数
  • 使用带有open的O_LARGEFILE标志对大文件进行操作
使用和
fgetpos(3)
。它们使用的是
fpos\u t
数据类型,我相信它保证能够保存至少64位。

您是否尝试过将\u FILE\u OFFSET\u bits预处理器符号设置为64

这将为您提供一个类似于fseek()的界面,但带有类型为off\u t的偏移参数,而不是long。设置\u FILE\u OFFSET\u BITS=64将使关闭\u t为64位类型


如果您想坚持ISO C标准接口,请使用和。但是,这些函数仅在保存文件位置并稍后返回到相同位置时有用。它们使用类型
fpos\u t
表示位置,不要求为整数数据类型。例如,在基于记录的系统上,它可以是包含记录编号和记录内偏移量的结构。这可能太有限了

POSIX定义了函数和,它们使用
off\t
类型表示位置。这要求是整数类型,并且该值是距文件开头的字节偏移量。您可以对其执行算术运算,并可以使用
fseeko()
执行相对搜索。这将适用于Linux和其他POSIX系统


此外,使用
-D\u FILE\u OFFSET\u BITS=64
(Linux/Solaris)进行编译。这将把
off\u t
定义为64位类型(即
off64\u t
),而不是
long
,并将使用文件偏移的函数重新定义为采用64位偏移的版本。这是编译64位时的默认值,因此在这种情况下不需要。

因此,我按照您的说明进行了操作,所有内容都在编译文件。但我似乎还是有点不知所措。如何在fopen64中使用O_LARGEFILE参数?如果使用-D_FILE_OFFSET_BITS=64进行编译,将自动提供O_LARGEFILE。这不是一个标准的标志;它在Linux上用于跟踪文件是否是用大文件接口打开的。您已经问过这个问题,C++是使用C/C++文件操作与C++流混合,还是只使用C API?另外,您是否有一些测试代码来重现该行为?使用正确的类型处理长度/偏移量是至关重要的。我只使用C API,并且一直使用off64\t作为我的类型。这个答案的关键是-D\u FILE\u OFFSET\u BITS=64,这实际上解决了我的问题。当使用多个共享库时,我的建议是将其应用于所有构建生成文件。