Pregunta

Estoy tratando de encontrar una respuesta definitiva y no puedo, así que espero que alguien lo sepa.

Estoy desarrollando una aplicación C ++ usando GCC 4.x en Linux (SO de 32 bits). Esta aplicación necesita poder leer archivos & Gt; 2 GB de tamaño.

Realmente me gustaría usar cosas iostream vs punteros de ARCHIVO, pero no puedo encontrar si el archivo grande #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) tiene algún efecto en los encabezados iostream.

Estoy compilando en un sistema de 32 bits. Cualquier puntero sería útil.

¿Fue útil?

Solución

Esto ya se decidió cuando se compiló libstdc++, y normalmente depende de si _GLIBCXX_USE_LFS se definió o no en c++config.h.

En caso de duda, pase su ejecutable (o libstdc++.so, si se vincula dinámicamente) a través de readelf -r (o a través de strings) y vea si su binario / fopen se vincula a fseek / <= > / etc. o fopen64 / fseek64 / etc.

UPDATE

No tiene que preocuparse por el límite de 2GB siempre que no necesite / intente ftell o <=> (solo lea o escriba en la transmisión)

Otros consejos

Si está utilizando GCC, puede aprovechar una extensión de GCC llamada __gnu_cxx :: stdio_filebuf, que vincula un IOStream a un descriptor estándar C FILE .

Debe definir las siguientes dos cosas:

  

_LARGEFILE_SOURCE

     

_FILE_OFFSET_BITS = 64

Por ejemplo:

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

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top