17

几周前,我使用 std::ifstream 读取一些文件,但由于文件大于 4GB,因此在打开时立即失败。当时我找不到一个体面的答案来解释为什么它被限制为 32 位文件大小,所以我使用本机 OS API 编写了自己的。

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

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

4

5 回答 5

14

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

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

给你当前的最大值是多少。

STLport支持更大的文件。

于 2008-11-16T09:01:18.000 回答
5

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

于 2008-11-16T13:52:18.783 回答
2

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

您必须直接使用操作系统的本机 API 或包装它的一些库才能做到这一点,而不必信任标准库实现,这些实现在很大程度上依赖于实现。

于 2008-11-16T14:41:47.483 回答
1

至少在 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-在 x64 平台上输入偶数

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

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

于 2015-06-03T04:15:26.140 回答
0

如果您可以摆脱只使用标准 C++,那么您可能会对boost::iostreams感兴趣。

于 2009-11-18T13:36:31.940 回答