Muy buenas. Pues resulta que llevo unos cuantos dias con dolores de cabeza intentando escribir objetos (ojo, no struct), y leerlos en/de un fichero binario, pero me han surgido varios problemas:
-He leido que C++ solo puede serializar tipos base, con que el manejo de las cadenas de texto como propiedad, se hace algo mas tedioso.
-Si intento crear como propiedad un char*, no se como escribir en el fichero el contenido, y no la direccion del puntero.
-Como ultima opcion he optado por crear arrays estaticos de lonjitud fija, pero a la hora de pasarlos por parametro al constructor, o devolverlos con un get, el compilador no se lo traga.
¿Alguna sugerencia?
Os dejo mi codigo:
class Cliente { private: char nombre[20]; char ciudad[20]; long IDcliente; public: long getIDcliente() const; char* getNombre() ; char* getCiudad() ; void setIDcliente(long IDcliente); void setNombre(char* nombre); void setCiudad(char* ciudad); Cliente(); Cliente(string, long,string); virtual ~Cliente(); friend ostream& operator<<(ostream&, Cliente&); void strToChar(string, char*); };
int main() { escribir(); leer(); return 0; } void escribir(){ ofstream salida; string nombre, ciudad; long id; list <Cliente*> lista; salida.open("src/datos.dat", ios::binary|ios::app); for (int i = 0; i < 2; i++) { cout<<"Introduzca nombre"<<endl; cin>> nombre; cout<<"Introduzca id"<<endl; cin>> id; cout<<"Introduzca ciudad"<<endl; cin>> ciudad; lista.push_back(new Cliente(nombre, id,ciudad)); salida.write((char*)(lista.back()),sizeof(Cliente)); } salida.close(); } void leer(){ ifstream entrada; Cliente cliente; entrada.open("src/datos.dat", ios::binary|ios::app); entrada.seekg(0,ios::end); long longitudFichero=entrada.tellg(); entrada.seekg(0, ios::beg); if(!entrada.good()) return; for (int i = 0; i < (longitudFichero/sizeof(Cliente)); i++) { entrada.read((char*)(&cliente),sizeof(Cliente)); cout<<entrada.tellg(); cout<<cliente<<endl; } entrada.close(); }
Usa el operator <<
En C++ no es tán inmediato como en Java con los serializables, pero se puede. Lo primero es que tienes que implementar el operador << que has declarado en la clase para que escriba el nombre, la ciudad y el ID:
(El operador >> sería igual cambiando entrada por salida).
Después en los métodos de leer y escribir llamas a los operadores, en lugar de hacer eso.
Problema: que aunque el nombre solo tenga 1 caracter, en el archivo siempre ocupará 20, aunque en tu caso no es un problema demasiado gordo.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Gracias! Tenia sobrecargado
Gracias! Tenia sobrecargado el << para mostrar por pantalla, pero no se me habia ocurrido hacerlo asi para los ficheros.
Un saludo!