2011-12-29 9 views
5

Finora ho codice per leggere un unsigned char da ifstream:Come posso leggere e scrivere caratteri non firmati in file con fstream in C++?

ifstream in; 
unsigned char temp; 

in.open ("RANDOMFILE", ios::in | ios::binary); 
in.read (&temp, 1); 
in.close(); 

È corretto? Ho anche provato a scrivere un unsigned char a un ofstream:

ofstream out; 
unsigned char temp; 

out.open ("RANDOMFILE", ios::out | ios::binary); 
out.write (&static_cast<char>(temp), 1); 
out.close(); 

Ma io ottenere il seguente errore per la scrittura:

error C2102: '&' requires l-value 

E questo errore per la lettura:

error C2664: 'std::basic_istream<_Elem,_Traits>::read' : cannot convert parameter 1 from 'unsigned char *' to 'char *' 

Sarebbe essere apprezzato se qualcuno potrebbe dirmi cosa c'è di sbagliato nel mio codice o come posso leggere e scrivere caratteri non firmati da fstream.

risposta

8

L'errore di scrittura indica che si sta prendendo l'indirizzo del temporaneo creato da static_cast.

Invece di:

// Make a new char with the same value as temp 
out.write (&static_cast<char>(temp), 1); 

utilizzare gli stessi dati già in temperatura:

// Use temp directly, interpreting it as a char 
out.write (reinterpret_cast<char*>(&temp), 1); 

La lettura errore sarà anche essere fissato se dite al compilatore di interpretare i dati come un char :

in.read (reinterpret_cast<char*>(&temp), 1); 
2

La funzione di read alw ays accetta byte come argomenti, rappresentati come valori char per comodità. Si può lanciare il puntatore questi byte in giro tanto quanto si desidera, in modo

in.read (reinterpret_cast<char*>(&temp), 1); 

leggerà un singolo byte che bene. Ricorda che la memoria è memoria è memoria, e i tipi di C++ sono solo un'interpretazione della memoria. Quando si leggono i byte non elaborati nella memoria non elaborata (come con read), è necessario leggere prima e quindi eseguire il cast nel tipo appropriato.

Problemi correlati