2011-12-29 11 views
5

Hasta ahora he código para leer un unsigned char de ifstream:¿Cómo puedo leer y escribir caracteres sin signo en archivos con fstream en C++?

ifstream in; 
unsigned char temp; 

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

Es esto correcto? También he tratado de escribir 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(); 

pero me da el siguiente error de escritura:

error C2102: '&' requires l-value 

Y este error para la lectura:

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

Sería ser apreciado si alguien pudiera decirme qué le pasa a mi código o cómo puedo leer y escribir caracteres sin signo de fstream.

Respuesta

8

El error de escritura le informa que está tomando la dirección del temporal creado por static_cast.

En lugar de:

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

utilizar los mismos datos que ya están en temp:

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

La lectura de error también se fijará si le dice al compilador para interpretar los datos como un char :

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

La función read alw ays toma bytes como argumentos, representados como char valores por conveniencia. Puede emitir el puntero a estos bytes en torno a todo lo que quiere, por lo

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

leerá un solo byte bien. Recuerde que la memoria es memoria es memoria, y los tipos de C++ son solo una interpretación de la memoria. Cuando está leyendo bytes sin formato en la memoria sin procesar (como con read), debe leer primero y luego convertir al tipo apropiado.

Cuestiones relacionadas