iostream et support de fichiers volumineux
-
20-08-2019 - |
Question
J'essaie de trouver une réponse définitive et ne le peux pas. J'espère donc que quelqu'un le saura.
Je développe une application C ++ utilisant GCC 4.x sous Linux (système d'exploitation 32 bits). Cette application doit pouvoir lire les fichiers & Gt; 2 Go de taille.
Je voudrais vraiment utiliser les informations iostream par rapport aux pointeurs FILE, mais je ne peux pas trouver si le fichier volumineux #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) a un effet quelconque sur les en-têtes iostream.
Je compile sur un système 32 bits. Tout pointeur serait utile.
La solution
Cela a déjà été décidé pour vous lorsque libstdc++
a été compilé, et dépend normalement de la question de savoir si _GLIBCXX_USE_LFS
a été défini ou non dans c++config.h
.
En cas de doute, transmettez votre exécutable (ou libstdc++.so
si vous le liez de manière dynamique) via readelf -r
(ou via strings
) et voyez si votre fichier binaire / fopen
est lié à fseek
/ <= > / etc. ou fopen64
/ fseek64
/ etc.
MISE À JOUR
Vous n'avez pas à vous soucier de la limite de 2 Go tant que vous n'avez pas besoin / tenté de ftell
ou <=> (vous venez de lire ou d'écrire dans le flux.)
Autres conseils
Si vous utilisez GCC, vous pouvez tirer parti d'une extension GCC appelée __gnu_cxx :: stdio_filebuf, qui lie un flux IOS à un descripteur C FILE standard.
Vous devez définir les deux éléments suivants:
_LARGEFILE_SOURCE
_FILE_OFFSET_BITS = 64
Par exemple:
#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;
}