在C + MinGW32中使用64位地址执行文件操作

时间:2009-10-14 20:39:06

标签: cygwin mingw large-file-support

我正在尝试用C语言读取24 GB的XML文件,但它不起作用。当我读到它时,我正在使用ftell()打印出当前位置,但是一旦它达到足够大的数字,它就会回到一个小数字并重新开始,甚至从未获得20%的文件。我认为这是用于存储位置(长)的变量范围的问题,根据http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx可以达到大约4,000,000,000,而我的文件大小为25,000,000,000字节。长期应该有效,但是我如何更改我的编译器(Cygwin / mingw32)使用或使其拥有fopen64?

6 个答案:

答案 0 :(得分:3)

ftell()函数通常返回unsigned long,在32位系统上只能返回2 32 字节(4 GB)。因此,您无法获得24 GB文件的文件偏移量以适应32位long

您可以使用ftell64()功能,或者标准fgetpos()功能可能会向您返回更大的偏移量。

答案 1 :(得分:3)

您可以尝试使用操作系统提供的文件函数CreateFile and ReadFile。根据{{​​3}}主题,该位置存储为64位值。

答案 2 :(得分:0)

除非你能按照Loadmaster的建议使用64位方法,否则我认为你必须打破文件。

This resource似乎暗示可以使用_telli64()。我不能测试这个,因为我不使用mingw。

答案 3 :(得分:0)

我不知道有什么方法可以在一个文件中执行此操作,有点像黑客但是如果正确拆分文件不是一个真正的选项,你可以编写一些临时拆分文件的函数,一个使用ftell()在文件中移动并在到达分割点时将ftell()交换到新文件,然后在退出之前将文件重新拼接在一起。一种绝对拙劣的方法,但如果没有更好的解决方案,它可能是一种完成工作的方法。

答案 4 :(得分:0)

我找到了答案。而不是使用fopen,fseek,fread,fwrite ......我正在使用_open,lseeki64,读取,写入。我能够在>中写作和寻找4GB文件。

编辑:似乎后者的功能比前者慢约6倍。我会给那些可以解释的人赏金。

编辑:哦,我在这里了解到read()和朋友都没有缓冲。 What is the difference between read() and fread()?

答案 5 :(得分:-1)

即使Microsoft C库中的ftell()返回32位值,因此一旦达到2 GB,显然会返回伪值,只需读取该文件仍然可以正常工作。或者你也需要在文件中寻找?为此你需要_ftelli64()和_fseeki64()。

请注意,与某些Unix系统不同,打开文件时不需要任何特殊标志,以指示它处于某种“64位模式”。底层的Win32 API处理大文件就好了。