Frage

Ich versuche, eine definitive Antwort zu finden und kann nicht, so dass ich hoffe, dass jemand vielleicht wissen.

Ich entwickle eine C ++ App GCC 4.x unter Linux mit (32-Bit-OS). Diese App muss in der Lage sein, Dateien zu lesen> 2 GB groß.

Ich mag wirklich Iostream Sachen gegen FILE-Zeiger verwenden, aber ich kann nicht finden, wenn die große Datei #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) hat keine Auswirkungen auf den iostream-Header.

Ich bin Kompilieren auf einem 32-Bit-System. Alle Zeiger wären hilfreich.

War es hilfreich?

Lösung

Dies ist für Sie bereits entschieden, als libstdc++ kompiliert wurde, und in der Regel hängt davon ab, ob oder ob nicht _GLIBCXX_USE_LFS definiert wurde in c++config.h.

Im Zweifelsfall geben Ihre ausführbare Datei (oder libstdc++.so, wenn gegen sie dynamisch Verknüpfung) durch readelf -r (oder durch strings) und sehen, ob die Binärdatei / libstdc++ gegen verknüpft fopen / fseek / etc. oder fopen64 / fseek64 / etc.

UPDATE

Sie müssen die 2GB Grenze nicht darum kümmern, solange Sie nicht brauchen / Versuch zu fseek oder ftell (die Sie gerade gelesen oder in den Stream schreiben.)

Andere Tipps

Wenn Sie GCC verwenden, können Sie die Vorteile einer GCC-Erweiterung nehmen __gnu_cxx genannt :: stdio_filebuf, die eine Iostream zu einem Standard-C-Bindungen Datei Descriptor.

Sie müssen die folgenden zwei Dinge definieren:

  

_LARGEFILE_SOURCE

     

_FILE_OFFSET_BITS = 64

Zum Beispiel:

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

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top