Joh*_*one 14 c c++ linux gnu large-files
我使用G ++中的标准ftell和fseek选项进入整数溢出,但我想我错了,因为似乎ftell64和fseek64不可用.我一直在搜索,许多网站似乎使用lseek和off64_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上有很大的文件支持:
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位时这是默认设置,因此在这种情况下不需要.
fseek64() 不是标准的,编译器文档应该告诉你在哪里找到它.
您是否尝试过fgetpos与fsetpos?它们是为大文件设计的,实现通常使用64位类型作为fpos_t的基础.