几个星期前,我使用std :: ifstream读取一些文件,并且因为文件大于4GB而在打开时立即失败。当时我无法找到一个合适的答案,为什么它限于32位文件大小,所以我使用本机OS API编写了自己的。
那么,我的问题是:有没有办法使用std :: ifstream / std :: ostream(IE:标准c ++)来处理大小超过4GB的文件
编辑:使用VC 9编译器(Visual Studio 2008)中的STL实现。 编辑2:当然必须有标准的方法来支持大于4GB的文件大小。
答案 0 :(得分:14)
显然,这取决于库如何实现off_t
。
#include <streambuf>
__int64_t temp=std::numeric_limits<std::streamsize>::max();
为您提供当前最大值。
STLport支持更大的文件。
答案 1 :(得分:5)
答案 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平台如何)