【问题标题】:iostream and large file supportiostream 和大文件支持
【发布时间】:2010-10-14 05:23:30
【问题描述】:

我正试图找到一个明确的答案,但我找不到,所以我希望有人知道。

我正在 Linux(32 位操作系统)上使用 GCC 4.x 开发 C++ 应用程序。此应用需要能够读取大于 2GB 的文件。

我真的很想使用 iostream 的东西与 FILE 指针,但我找不到大文件 #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS=64) 是否对 iostream 标头有任何影响。

我在 32 位系统上编译。任何指针都会有所帮助。

【问题讨论】:

    标签: c++ stl iostream large-files large-file-support


    【解决方案1】:

    这在编译libstdc++ 时已经为您确定,通常取决于_GLIBCXX_USE_LFS 是否在c++config.h 中定义。

    如果有疑问,请通过readelf -r(或通过strings)传递您的可执行文件(或libstdc++.so,如果是动态链接)并查看您的二进制文件/libstdc++ 是否链接到fopen/@987654329 @/等等。或fopen64/fseek64/等。

    更新

    只要您不需要/尝试fseekftell(您只需读取或写入流),您就不必担心 2GB 的限制。

    【讨论】:

    • 我确实需要查找/读取位置,但我确认我的 c++ 库支持 LFS,因此我可以使用 fstream 的告诉和查找调用。谢谢!
    【解决方案2】:

    如果您使用的是 GCC,则可以利用名为 __gnu_cxx::stdio_filebuf 的 GCC 扩展,它将 IOStream 与标准 C FILE 描述符联系起来。

    你需要定义以下两件事:

    _LARGEFILE_SOURCE

    _FILE_OFFSET_BITS=64

    例如:

    #include <cstdio>
    #include <fstream>
    #include <ext/stdio_filebuf.h>
    
    int main()
    {
      std::ofstream outstream;
      FILE* outfile;
    
      outfile = fopen("bigfile", "w");
    
      __gnu_cxx::stdio_filebuf<char> fdbuf(outfile, std::ios::out |
                                           std::ios::binary);
      outstream.std::ios::rdbuf(&fdbuf);
    
      for(double i = 0; i <= 786432000000.0; i++) {
        outstream << "some data";
    
      fclose(outfile);
      return 0;
    

    }

    【讨论】:

    • 这并不能真正解决任何问题。需要 64 位偏移支持才能调用 ftell/fseek;为此使用 stdio_sync_filebuf,但这依赖于已定义的 _GLIBCXX_USE_LFS
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多