在 Linux C++ 中查找和读取大文件 应用
我使用 G++ 内的标准 ftell 和 fseek 选项遇到整数溢出,但我想我错了,因为似乎 ftell64 和fseek64 不可用。 我一直在搜索,许多网站似乎引用使用 lseek 和 off64_t 数据类型,但我没有找到任何引用等于 fseek 的示例。 现在我正在读取的文件是 16GB 以上的 CSV 文件,预计至少是这个大小的两倍。
在没有任何外部库的情况下,实现与fseek/ftell对类似的结构的最直接方法是什么? 我的应用程序现在使用 4.x 的标准 GCC/G++ 库运行。
I am running into integer overflow using the standard ftell and fseek options inside of G++, but I guess I was mistaken because it seems that ftell64 and fseek64 are not available. I have been searching and many websites seem to reference using lseek with the off64_t datatype, but I have not found any examples referencing something equal to fseek. Right now the files that I am reading in are 16GB+ CSV files with the expectation of at least double that.
Without any external libraries what is the most straightforward method for achieving a similar structure as with the fseek/ftell pair? My application right now works using the standard GCC/G++ libraries for 4.x.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
fseek64 是一个 C 函数。 为了使其可用,您必须在包含系统标头之前定义 _FILE_OFFSET_BITS=64 这或多或少将 fseek 定义为实际的 fseek64。 或者在编译器参数中执行此操作,例如
gcc -D_FILE_OFFSET_BITS=64 ....
http://www.suse.de/~aj/ linux_lfs.html 对 Linux 上的大文件支持进行了很好的概述:
fseek64 is a C function. To make it available you'll have to define _FILE_OFFSET_BITS=64 before including the system headers That will more or less define fseek to be actually fseek64. Or do it in the compiler arguments e.g.
gcc -D_FILE_OFFSET_BITS=64 ....
http://www.suse.de/~aj/linux_lfs.html has a great overviw of large file support on linux:
如果您想坚持使用 ISO C 标准接口,请使用
fgetpos()< /code>
和
fsetpos()
< /a>. 但是,这些函数仅适用于保存文件位置并稍后返回到同一位置。 它们使用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 位时的默认设置,因此在这种情况下不需要。If you want to stick to ISO C standard interfaces, use
fgetpos()
andfsetpos()
. However, these functions are only useful for saving a file position and going back to the same position later. They represent the position using the typefpos_t
, which is not required to be an integer data type. For example, on a record-based system it could be a struct containing a record number and offset within the record. This may be too limiting.POSIX defines the functions
ftello()
andfseeko()
, which represent the position using theoff_t
type. This is required to be an integer type, and the value is a byte offset from the beginning of the file. You can perform arithmetic on it, and can usefseeko()
to perform relative seeks. This will work on Linux and other POSIX systems.In addition, compile with
-D_FILE_OFFSET_BITS=64
(Linux/Solaris). This will defineoff_t
to be a 64-bit type (i.e.off64_t
) instead oflong
, and will redefine the functions that use file offsets to be the versions that take 64-bit offsets. This is the default when you are compiling for 64-bit, so is not needed in that case.fseek64()
不是标准的,编译器文档应该告诉您在哪里可以找到它。您尝试过
fgetpos
和fsetpos
吗? 它们是为大文件设计的,并且实现通常使用 64 位类型作为 fpos_t 的基础。fseek64()
isn't standard, the compiler docs should tell you where to find it.Have you tried
fgetpos
andfsetpos
? They're designed for large files and the implementation typically uses a 64-bit type as the base for fpos_t.您是否尝试过 fseeko() _FILE_OFFSET_BITS 预处理器符号设置为64?
这将为您提供类似 fseek() 的接口,但具有 off_t 类型的偏移参数,而不是 long 类型。 设置 _FILE_OFFSET_BITS=64 将使 off_t 成为 64 位类型。
对于 ftello() 也是如此。
Have you tried fseeko() with the _FILE_OFFSET_BITS preprocessor symbol set to 64?
This will give you an fseek()-like interface but with an offset parameter of type off_t instead of long. Setting _FILE_OFFSET_BITS=64 will make off_t a 64-bit type.
The same for goes for ftello().
使用
fsetpos(3)
和fgetpos( 3)
。 他们使用fpos_t
数据类型,我相信它保证能够保存至少 64 位。Use
fsetpos(3)
andfgetpos(3)
. They use thefpos_t
datatype , which I believe is guaranteed to be able to hold at least 64 bits.