代码之家  ›  专栏  ›  技术社区  ›  Raindog

使用C++ STL读取大于4GB的文件

  •  17
  • Raindog  · 技术社区  · 16 年前

    那么,我的问题是:有没有一种方法可以使用std::ifstream/std::ostream(即:标准c++)处理大于4GB的文件

    编辑:使用VC9编译器中的STL实现(VisualStudio2008)。

    5 回复  |  直到 15 年前
        1
  •  14
  •   Eugene Yokota    16 年前

    显然,这取决于怎么做 off_t 由库实现。

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

    STLport 支持较大的文件。

        2
  •  5
  •   BatchyX    16 年前

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

        3
  •  2
  •   Johannes Schaub - litb    16 年前

    从标准的角度来看,没有什么可以阻止这一点。然而,在现实中,大多数32位实现都使用32位来实现 std::size_t std::off_t

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

        4
  •  1
  •   zhaorufei    9 年前

    至少在VS2013中,C++标准FielestRAMM与大文件(以及G4G字节)一起工作。

    我在VS2013上进行了测试(有更新3)。

    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)
    

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

    简言之: 斯蒂芬·T·拉瓦维 (Visual C++库开发人员)

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

        5
  •  0
  •   user153062 user153062    15 年前