Tengo una lista enlazada en la que inserto, elimino y modifico elementos, específicamente Contactos (una clase que cree con las propiedades nombre, apellido y teléfono). Todas las operaciones funcionan correctamente en memoria, pero tengo problemas al grabar la lista en un archivo y luego leer el archivo.
Este es el método guardar de la
clase Lista (que escribe los elementos de la lista (los Contactos) en un archivo:
bool Lista::guardar(char* nombreArchivo) {
FILE* archivo = 0;
Nodo* itr = m_cabeza; // puntero que itera por todos los elementos de la lista, iniciando por la cabeza.
archivo = fopen(nombreArchivo, "wb");
if(archivo == 0){
return false;
}
fwrite(&m_tamano, sizeof(int), 1, archivo); // lo primero que escribo es el numero de elementos de la lista.
for(int i = 0; i < m_tamano; i++) {
// cada elemento de la lista tiene un contacto que voy a escribir en el archivo, por eso: itr->m_contacto.
fwrite( &(itr->m_contacto), sizeof(Contacto), 1, archivo);
itr = itr->m_siguiente;
}
fclose(archivo);
return true;
}
Y el método leer que también está en la clase Lista:
bool Lista::read(char* nombreArchivo) {
FILE* archivo = 0;
archivo = fopen(nombreArchivo, "rb");
if(archivo == 0) {
return false;
}
Contacto contacto;
int numContactos = 0;
fread(&numContactos, sizeof(int), 1, archivo); // leo el numero de contactos para saber cuantos contactos voy a recuperar del archivo
cout << "NUMERO DE CONTACTOS: " << numContactos << endl;
while(numContactos != 0) {
fread(&contacto, sizeof(Contacto), 1, archivo);
append(contacto); //append es el metodo de la Lista que inserta un elemento en la misma
numContactos--;
}
fclose(archivo);
return true;
}
Pero el programa explota tan pronto como llamo al metodo leer (al inicio de main) y sale que Windows ha encontrado un problema y el programa debe cerrarse... No entiendo porque pasa eso, estoy cansado de darles vueltas al asunto. Lo único que consigo extraer del archivo es el numero de contactos, pero después si quiero acceder a una de las propiedades de los contactos que he recuperado del archivo, explota.