Domanda

Qualche settimana fa stavo usando std :: ifstream per leggere alcuni file e non si apriva immediatamente all'apertura perché il file era più grande di 4 GB. Al momento non riuscivo a trovare una risposta decente sul perché fosse limitato a dimensioni di file a 32 bit, quindi ho scritto il mio usando l'API del sistema operativo nativo.

Quindi, la mia domanda allora: c'è un modo per gestire file di dimensioni superiori a 4 GB usando std :: ifstream / std :: ostream (IE: standard c ++)

EDIT: utilizzo dell'implementazione STL dal compilatore VC 9 (Visual Studio 2008). EDIT2: Sicuramente ci deve essere un modo standard per supportare file di dimensioni superiori a 4 GB.

È stato utile?

Soluzione

Apparentemente dipende da come off_t è implementato dalla libreria.

#include <streambuf>
__int64_t temp=std::numeric_limits<std::streamsize>::max();

ti dà quello che è il massimo corrente.

STLport supporta file di dimensioni maggiori.

Altri suggerimenti

Ho riscontrato questo problema diversi anni fa usando gcc su Linux. Il sistema operativo supportava file di grandi dimensioni e la libreria C (fopen, ecc.) Lo supportava, ma la libreria standard C ++ no. Ho scoperto che dovevo ricompilare la libreria standard C ++ usando i flag corretti del compilatore.

Dal punto di vista standard, non c'è nulla che lo impedisca. Tuttavia, in realtà, la maggior parte delle implementazioni a 32 bit utilizza 32 bit per std :: size_t . Ora, lo standard C ++ impone che l'allocatore standard nella libreria standard C ++ usi std :: size_t come quantità di dimensioni. Pertanto, si è limitati a 2 ^ 32 byte di memoria per contenitori, stringhe e altro. La situazione potrebbe essere un'altra per std :: off_t , non so esattamente cosa stia succedendo lì.

Devi usare direttamente l'API nativa del sistema operativo, o alcune librerie che la racchiudono, per poterlo fare, senza doverti fidare delle implementazioni della libreria standard, che dipendono in larga misura dall'implementazione.

Se riesci ad allontanarti dall'uso del solo C ++ standard, potresti essere interessato a boost :: iostreams .

Almeno in VS2013, il filestream standard C ++ funziona bene con file di grandi dimensioni (> 4GBytes).

Ho provato su VS2013 (con update3).

int64_t file_pos = 4LL * 1024 * 1024 * 1024 + 1;
file.seekp( file_pos, SEEK_SET );
assert( file );
cout << "cur pos: " << file.tellp() << endl; // the output is: 4294967297(4GB + 1)

Il seguente link è un'ulteriore conferma che si tratta di un bug ed è stato corretto: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos-type-even-on-x64-platform

in breve: Stephan T. Lavavej (Sviluppatore di librerie di Visual C ++) ha detto

  

L'abbiamo risolto e la correzione sarà disponibile in VC11 ... quindi il supporto di file di grandi dimensioni dovrebbe funzionare correttamente ora (indipendentemente dalla piattaforma x86 / x64)

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