iostream e supporto per file di grandi dimensioni
-
20-08-2019 - |
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.
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;
}