Iostream und Unterstützung für große Dateien
-
20-08-2019 - |
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.
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;
}