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.

Était-ce 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;

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top