在C中访问大文件

时间:2012-01-16 02:48:39

标签: c windows visual-studio

我需要使用C访问大于2gb的文件。在程序的一次运行期间,将从文件中读取可变数量的字节并保存下一个位置的位置。在下一次运行程序期间,将读取文件位置,并从该位置开始读取多个字节。

复杂的是偶尔可以通过将文件复制到新文件来“压缩”文件,减少已经读取的任何字节(我认为复制是唯一的方法)。以这种方式删除的字节数也将被保存。

我需要知道文件从原始开始的当前位置,以便与另一个文件同步。这应该很简单,因为它只是(current_offset + deleted_bytes)。

不容易的原因是fseek只使用long int索引将文件限制为2gb,而fsetpos使用fpos_t结构作为位置索引,这不是数字,不能来回转换一。我不知道如何使用long long int索引进行文件定位,这将是理想的解决方案。

我该怎么办?

2 个答案:

答案 0 :(得分:6)

在Windows上,您可以使用_lseeki64()进行64位搜索。

为了与linux兼容,您还可以在编译时添加-D_FILE_OFFSET_BITS=64,然后在其中一个标题中执行此操作:

#ifdef __MINGW32__ // or whatever you use to find out you're compiling on windows
#define lseek _lseeki64
#endif

然后像往常一样使用lseek()。这是有效的,因为Windows会忽略_FILE_OFFSET_BITS标志,并且linux不会看到lseek的重新定义。

如果您更喜欢FILE*版本,还有_fseeki64(),并且还有等效的64位tell()ftell()函数(_telli64()和{{1} }})。

答案 1 :(得分:1)

添加编译标记-D_FILE_OFFSET_BITS=64,使fopenfseekoff_t等变为64位,可用于处理大小超过2 GB的文件。有关详细信息,请参阅Large File Support in Linux