我需要解析一个可能有几个GB大小的文件。我想用C语言实现这个功能。有人能提供一些方法来完成这个任务吗?
我需要打开和解析的文件是我从我的Mac硬盘中获取的硬盘转储文件。然而,我计划在64位Ubuntu 10.04中运行我的程序。另外,考虑到文件大小较大,所以最优化的方法越好。
我需要解析一个可能有几个GB大小的文件。我想用C语言实现这个功能。有人能提供一些方法来完成这个任务吗?
我需要打开和解析的文件是我从我的Mac硬盘中获取的硬盘转储文件。然而,我计划在64位Ubuntu 10.04中运行我的程序。另外,考虑到文件大小较大,所以最优化的方法越好。
fseek()
和ftell()
,以便您可以对整个文件进行随机访问。否则,普通的fopen()
、fread()
和相关函数可以对任何大小的文件进行顺序访问,只要底层操作系统和stdio实现支持大文件即可。off_t
应该是定位文件指针的正确选择。int
或long
几乎总是错误的,它们太依赖编译器/平台。使用int64_t
(如果没有,则使用int_fast64_t
)。off_t
被定义为long
,因此在32位机器上它只有32位。通常情况下,你需要使用-D_FILE_OFFSET_BITS=64
选项对整个程序进行构建,并使用fseeko
和ftello
函数来获取合理的行为 - 当然也要使用off_t
类型来保存偏移量变量。顺便说一句,即使你从不执行任何寻址操作,在没有大文件支持的情况下,IO也会在超过2GB的文件上失败。 - R.. GitHub STOP HELPING ICEoff_t
而不定义正确的宏是行不通的。 - bdonlan为所有相关源文件定义宏-D_FILE_OFFSET_BITS=64
或#define _FILE_OFFSET_BITS 64
(最好是整个项目)。这个常见的宏由几个常见的构建系统自动提供。然后在API需要时使用off_t
(现在将是64位)。
根据乔姆斯基层次的不同,可能有几个免费和商业工具包可用于创建文件格式的解析器。我认为你认为自己面临的真正问题是如何“处理”数GB的数据。
你想同时将所有数据存储在内存中吗?
一种方法是将文件的部分写入磁盘上的临时文件中,在不使用时。简单的结构体fread / fwrite和一些聪明的引用计数的“按需”加载和写入可以实现这一点。