2013-07-21 9 views
5

Per copiare ciò che ho letto dal file di input al vettore, ho utilizzato std::copy() come consigliato in Reading an std::ifstream to a vector of lines.Alcuni byte mancano dopo aver letto uno std :: ifstream a un vettore di linee

Il problema si verifica se uso:

std::copy(std::istream_iterator<unsigned char>(inputfile), 
      std::istream_iterator<unsigned char>(), 
      std::back_inserter(myVector)); 

Il 16 byte del mio file è mancante nella variabile myVector.

Ma se io uso il seguente codice:

inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile)); 

Poi il byte non manca più.

Sto cercando di analizzare i file WAV e ho perso troppo tempo su questo, spero di imparare qualcosa di nuovo da questo. Puoi dirmi cosa c'è di sbagliato nella prima versione del codice qui sopra?

+1

La prima versione utilizza una funzione di ingresso formattato, così saltando esempio ciò che interpreta come spazi bianchi. – dyp

+1

Il file è aperto in modalità binaria in entrambi i casi? –

+0

Sì, non ho cambiato nulla tranne sopra. Ho usato ifstream come; std :: iffile file di input (nameOfFile.c_str(), std :: ifstream :: in | std :: ifstream :: binary); –

risposta

6

istream_iterator utilizza operator >> per leggere gli elementi, ma operator >> salta gli spazi bianchi.

Si può provare a utilizzare noskipws

inputfile >> noskipws; 

§ 24.6.1 p1. (Corsivo mio) modello

La classe istream_iterator è un iteratore di input (24.2.3) che legge (tramite operatore >>) successive elementi dal flusso di input per il quale è stata costruita ....

+0

... se è impostato il flag skipws, che è per impostazione predefinita. – dyp

+0

Grazie per lo meno è bello imparare cose nuove. –

+1

Una soluzione migliore se si desidera leggere i byte binari. potrebbe essere usare 'std :: istreambuf_iterator'. –

1

Prima di tutto il file wav è un dato binario, così si dovrebbe trattare come tale, si dovrebbe aprire il file in modalità binaria:

ifstream ifs; 
ifs.open ("test.wav", ifstream::in | ifstream::binary); 

quindi, è necessario utilizzare o la funzione di lettura di un ristorante funziona come hai detto tu.

ifstream documentation

+0

perché ho ricevuto downvote? – nio

5

Come Riad Said, si opera la istream_iterator formattato ingresso tramite operator >>. La soluzione è utilizzare la lettura non formattata sul buffer sottostante. A tale scopo, utilizzare istreambuf_iterator:

std::copy(std::istreambuf_iterator<char>(inputfile), 
      std::istreambuf_iterator<char>(), 
      std::back_inserter(myVector)); 
+1

Non dovrebbe essere 'char' per' std :: ifstream'? – dyp

+0

@DyP Giusto, io * sempre * commetto questo errore. –

Problemi correlati