iostream和大文件支持

时间:2009-03-19 00:41:26

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

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

<强>更新

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

答案 1 :(得分: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;

}