iostream和大文件支持

7

我在寻找一个明确的答案,但无法找到,所以希望有人能知道。

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

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

我正在编译32位系统。任何提示都将有所帮助。

2个回答

8

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

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

更新

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


我确实需要寻找/读取位置,但我确认我的C++库支持LFS,因此我可以使用fstream的tell和seek调用。谢谢! - Joe

3

如果您正在使用GCC,您可以利用一个称为__gnu_cxx::stdio_filebuf的GCC扩展,它将IOStream绑定到标准C文件描述符。

您需要定义以下两个内容:

_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;

}


1
这并没有真正解决任何问题。需要64位偏移支持才能调用ftell/fseek;为此,请使用stdio_sync_filebuf,但这依赖于_GLIBCXX_USE_LFS已经被定义。 - vladr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接