iostream и поддержка больших файлов - PullRequest
7 голосов
/ 19 марта 2009

Я пытаюсь найти окончательный ответ и не могу, поэтому я надеюсь, что кто-то может знать.

Я занимаюсь разработкой приложения на C ++ с использованием GCC 4.x в Linux (32-разрядная ОС). Это приложение должно уметь читать файлы размером> 2 ГБ.

Мне бы очень хотелось использовать iostream против указателей FILE, но я не могу найти, как большой файл #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) как-нибудь повлияет на заголовки iostream.

Я компилирую в 32-битной системе. Любые указатели будут полезны.

Ответы [ 2 ]

8 голосов
/ 19 марта 2009

Это уже было решено для вас, когда libstdc++ был скомпилирован, и обычно зависит от того, был ли _GLIBCXX_USE_LFS определен в c++config.h.

Если сомневаетесь, передайте свой исполняемый файл (или libstdc++.so, если он динамически связывается с ним) через readelf -r (или через strings) и посмотрите, связан ли ваш двоичный файл / libstdc++ с fopen / fseek/так далее. или fopen64 / fseek64 / и т. д.

UPDATE

Вам не нужно беспокоиться об ограничении в 2 ГБ, если вам не нужно пытаться набрать fseek или ftell (вы просто читаете или пишете в поток).

2 голосов
/ 19 марта 2009

Если вы используете GCC, вы можете воспользоваться расширением GCC с именем __gnu_cxx :: stdio_filebuf, которое связывает 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;

}

...