Domanda

Sto cercando di trovare una risposta definitiva e non ci riesco, quindi spero che qualcuno lo sappia.

Sto sviluppando un'app C ++ usando GCC 4.x su Linux (sistema operativo a 32 bit). Questa app deve essere in grado di leggere i file & Gt; 2 GB di dimensione.

Mi piacerebbe davvero usare roba iostream vs. puntatori FILE, ma non riesco a trovare se il file di grandi dimensioni #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) ha alcun effetto sulle intestazioni di iostream.

Sto compilando su un sistema a 32 bit. Qualsiasi suggerimento sarebbe utile.

È stato utile?

Soluzione

Questo è già stato deciso per te quando libstdc++ è stato compilato e normalmente dipende dal fatto che _GLIBCXX_USE_LFS sia stato o meno definito in c++config.h.

In caso di dubbi, passa l'eseguibile (o libstdc++.so, se il collegamento è dinamico in modo contrario) attraverso readelf -r (o tramite strings) e vedi se il tuo binario / fopen è collegato contro fseek / <= > / etc. o fopen64 / fseek64 / ecc.

Aggiorna

Non devi preoccuparti del limite di 2 GB purché non sia necessario / tentare di ftell o <=> (hai appena letto o scritto nello stream.)

Altri suggerimenti

Se stai usando GCC, puoi trarre vantaggio da un'estensione GCC chiamata __gnu_cxx :: stdio_filebuf, che lega un IOStream a un descrittore C FILE standard.

Devi definire le seguenti due cose:

  

_LARGEFILE_SOURCE

     

_FILE_OFFSET_BITS = 64

Ad esempio:

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

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top