c处理大文件

我需要解析一个大小可能很多gbs的文件。 我想在C中这样做。任何人都可以建议任何方法来实现这一目标吗?

我需要打开和解析的文件是我从mac的硬盘驱动器获取的硬盘驱动器转储。 但是,我计划在64位Ubuntu 10.04中运行我的程序。 另外,由于文件大小越大,方法越优化越好。

在* nix和Windows上,都有I / O例程的扩展,这些例程触及文件大小,支持大于2GB或4GB的大小。 当然,底层文件系统也必须支持大文件。 在Windows上,NTFS可以,但FAT不是。 这通常称为“大文件支持”。

对于这些目的最关键的两个例程是fseek()ftell()以便您可以随机访问整个文件。 否则,普通的fopen()fread()以及朋友可以对任何大小的文件进行顺序访问,只要底层操作系统和stdio实现支持大文件即可。

假设您使用的是linux / bsd / mac / notwindows 64位系统(严肃地说,现在不是这样?), mmap表现非常出色。 它本质上允许您将整个文件映射到进程的地址空间,并让内核为您执行缓存/分页。

如果你必须使用Windows, 这里有相同的概念,但是由Redmond的友好人员制作。 请注意,对于其中任何一个,您将希望在64位系统上运行,因为您可以在32位系统上映射的ABSOLUTE最大文件大约为4GB。

为所有相关源(最好是整个项目)定义宏-D_FILE_OFFSET_BITS=64#define _FILE_OFFSET_BITS 64 。 这个常见的宏由几个常见的构建系统自动提供。 然后在API需要的地方使用off_t (现在将是64位)。

除了RBerteig和Matt的回答:

如果为项目中的所有文件正确且小心地启用64位IO支持(对于这些文件的方法是系统依赖的),我认为如果使用正确的类型,则不必担心整数溢出。 off_t应该是定位文件指针的正确选择。

如果所有其他方法都失败,请使用正确的C99类型,如果您对类型的宽度做出假设。 使用intlong几乎总是错误的做法,它们太依赖于编译器/平台。 使用int64_t (如果没有,则使用int_fast64_t )。

根据Chomsky级别 ,可能有几个免费和商业工具包来创建文件格式的解析器。 我认为你认为真正的问题是如何“处理”几GB的数据。

你想同时在内存中的所有数据吗?
一种方法是在不使用时将文件的一部分写入临时文件中的磁盘上。 结构的简单fread / fwrite,以及一些聪明的重新计数“按需”加载和写入可以做到这一点,