2015-02-24 27 views
5

Ho bisogno di leggere un file binario di grandi dimensioni (~ 1 GB) in un std::vector<double>. Attualmente sto usando infile.read per copiare l'intera cosa in un buffer char * (mostrato sotto) e attualmente sto pianificando di convertire l'intera cosa in doubles con reinterpret_cast. sicuramente ci deve essere un modo per inserire lo doubles direttamente nello vector?come leggere efficientemente un file binario in un vettore C++

io non sono anche sicuro circa il formato del file binario, il dato è stato prodotto in python quindi è probabilmente tutto galleggia

ifstream infile(filename, std--ifstream--binary); 

infile.seekg(0, infile.end);  //N is the total number of doubles 
N = infile.tellg();    
infile.seekg(0, infile.beg); 

char * buffer = new char[N]; 

infile.read(buffer, N); 
+0

C'è un motivo per cui si desidera utilizzare il doppio? I dati binari sono normalmente rappresentati come un carattere dato che, sulla maggior parte delle piattaforme, occupa un singolo byte. – Freddy

+4

Se non conosci il formato del file come hai intenzione di convertirlo? –

+1

Ummmmm .... vuoi leggere un file binario non conoscendo il formato come qualcosa di diverso da un flusso di byte? – luk32

risposta

7

Supponendo che l'intero file è doppio, altrimenti questo non funzionerà correttamente.

std::vector<double> buf(N/sizeof(double));// reserve space for N/8 doubles 
infile.read(reinterpret_cast<char*>(buf.data()), buf.size()*sizeof(double)); // or &buf[0] for C++98 
+0

La dichiarazione zero-initialises, che sembra un po 'dispendiosa. –

+0

@AlanStokes D'altra parte, l'operazione IO stessa è probabilmente il collo di bottiglia. Direi che va bene finché la misurazione non prova che questo è significativo. –

+0

Certamente non si vuole (e sicuramente non si può) salvare 1 GB di dati in un 'std :: array'. –