Anuncios Google

Escribir/Leer objetos en ficheros binarios (C++)

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();
}



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

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:

friend ostream & Cliente::operator<< (ostream &out, Cliente & cli){
  out.write ((char*) cli->nombre, 20*sizeof (char));
  out.write ((char*) cli->ciudad, 20*sizeof (char));
  out.write ((char*) cli->IDcliente, sizeof (long));
  return (out);
}

(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.


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Loopin

Gracias! Tenia sobrecargado

Gracias! Tenia sobrecargado el << para mostrar por pantalla, pero no se me habia ocurrido hacerlo asi para los ficheros.

Un saludo!


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.