elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa se cuelga al leer elementos de una lista guardados en un archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa se cuelga al leer elementos de una lista guardados en un archivo  (Leído 2,487 veces)
Aikanáro Anário


Desconectado Desconectado

Mensajes: 694



Ver Perfil WWW
Programa se cuelga al leer elementos de una lista guardados en un archivo
« en: 7 Noviembre 2012, 16:34 pm »

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:
Código
  1. bool Lista::guardar(char* nombreArchivo) {
  2. FILE* archivo = 0;
  3. Nodo* itr = m_cabeza; // puntero que itera por todos los elementos de la lista, iniciando por la cabeza.
  4. archivo = fopen(nombreArchivo, "wb");
  5. if(archivo == 0){
  6. return false;
  7. }
  8.  
  9. fwrite(&m_tamano, sizeof(int), 1, archivo); // lo primero que escribo es el numero de elementos de la lista.
  10. for(int i = 0; i < m_tamano; i++) {
  11.                 // cada elemento de la lista tiene un contacto que voy a escribir en el archivo, por eso: itr->m_contacto.
  12. fwrite( &(itr->m_contacto), sizeof(Contacto), 1, archivo);
  13. itr = itr->m_siguiente;
  14. }
  15.  
  16. fclose(archivo);
  17. return true;
  18. }
  19.  


Y el método leer que también está en la clase Lista:

Código
  1. bool Lista::read(char* nombreArchivo) {
  2. FILE* archivo = 0;
  3. archivo = fopen(nombreArchivo, "rb");
  4. if(archivo == 0) {
  5. return false;
  6. }
  7. Contacto contacto;
  8. int numContactos = 0;
  9. fread(&numContactos, sizeof(int), 1, archivo); // leo el numero de contactos para saber cuantos contactos voy a recuperar del archivo
  10.  
  11. cout << "NUMERO DE CONTACTOS: " << numContactos << endl;
  12.  
  13. while(numContactos != 0) {
  14. fread(&contacto, sizeof(Contacto), 1, archivo);
  15. append(contacto); //append es el metodo de la Lista que inserta un elemento en la misma
  16. numContactos--;
  17. }
  18. fclose(archivo);
  19. return true;
  20. }
  21.  

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.


« Última modificación: 7 Noviembre 2012, 16:57 pm por Aikanáro Anário » En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Programa se cuelga al leer elementos de una lista guardados en un archivo
« Respuesta #1 en: 7 Noviembre 2012, 18:17 pm »

Las funciones se pueden acortar un poco:

* "guardar" en base al uso del puntero "itr", no necesitas de otro contador para iterar por cada elemento de la lista.

* "read" utilizando el valor de retorno de la función "fread" (no hay necesidad del contador "numContactos").

Pero, considerando lo poco que muestras, el error no se encuentra en esas funciones. El primer candidato es la función "append" y no estaría de mas revisar todo el código fuente del programa.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Aikanáro Anário


Desconectado Desconectado

Mensajes: 694



Ver Perfil WWW
Re: Programa se cuelga al leer elementos de una lista guardados en un archivo
« Respuesta #2 en: 7 Noviembre 2012, 18:43 pm »

Acabo de descubrir que en parte mi problema es que C++ solo persiste tipos básicos (char, int, double, etc). Las propiedades de la clase Contacto son strings. Con razón es que lo único que podía recuperar era el número de elementos porque es un int, luego todo lo demás eran Contactos con atributos tipo string.

Voy a arreglarlo y luego escribo si funciona.



Efectivamente funcionó :D
« Última modificación: 7 Noviembre 2012, 19:20 pm por Aikanáro Anário » En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines