使用c ++ stl读取大于4GB的文件

时间:2008-11-16 08:14:24

标签: c++ file-io iostream

几个星期前,我使用std :: ifstream读取一些文件,并且因为文件大于4GB而在打开时立即失败。当时我无法找到一个合适的答案,为什么它限于32位文件大小,所以我使用本机OS API编写了自己的。

那么,我的问题是:有没有办法使用std :: ifstream / std :: ostream(IE:标准c ++)来处理大小超过4GB的文件

编辑:使用VC 9编译器(Visual Studio 2008)中的STL实现。 编辑2:当然必须有标准的方法来支持大于4GB的文件大小。

5 个答案:

答案 0 :(得分:14)

显然,这取决于库如何实现off_t

#include <streambuf>
__int64_t temp=std::numeric_limits<std::streamsize>::max();

为您提供当前最大值。

STLport支持更大的文件。

答案 1 :(得分:5)

几年前我在Linux上使用gcc遇到了这个问题。操作系统支持大文件,C库(fopen等)支持它,但C ++标准库没有。我发现我必须使用正确的编译器标志重新编译C ++标准库。

答案 2 :(得分:2)

从标准的角度来看,没有什么可以阻止这一点。但实际上,大多数32位实现对std::size_t使用32位。现在,C ++标准要求C ++标准库中的标准分配器使用std :: size_t作为大小数量。因此,对于容器,字符串和东西,您只能使用2 ^ 32字节的存储空间。情况可能是std::off_t的另一种情况,我不确切知道那里发生了什么。

您必须直接使用操作系统的本机API,或者包含它的某些库才能够这样做,而不必信任标准库实现,这些实现主要依赖于实现。

答案 3 :(得分:0)

如果您不能仅使用标准C ++,那么您可能会对boost::iostreams感兴趣。

答案 4 :(得分:0)

至少在VS2013中,C ++标准文件流可以很好地处理大文件(> 4GBytes)。

我在VS2013上测试过(使用update3)。

int64_t file_pos = 4LL * 1024 * 1024 * 1024 + 1;
file.seekp( file_pos, SEEK_SET );
assert( file );
cout << "cur pos: " << file.tellp() << endl; // the output is: 4294967297(4GB + 1)

以下链接是另一个确认,它是一个错误并已修复: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos-type-even-on-x64-platform

简称: Stephan T. Lavavej (Visual C ++ Libraries Developer)说

  

我们已修复它,修复程序将在VC11中提供...因此大文件支持现在可以正常工作(无论x86 / x64平台如何)