Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Guardar una lista en un fichero

Estas en el tema de Guardar una lista en un fichero en el foro de C/C++ en Foros del Web. Hola: Pues este es mi problema: Quiero guardar una lista en un fichero. Lo estoy haciendo así (lo he visto en StackOverflow) pero a la ...
  #1 (permalink)  
Antiguo 22/09/2014, 15:01
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Guardar una lista en un fichero

Hola:

Pues este es mi problema:
Quiero guardar una lista en un fichero. Lo estoy haciendo así (lo he visto en StackOverflow) pero a la hora de leer la lista que recupero de un fichero tengo un error.

Este es el código:
Código C++:
Ver original
  1. #include <fstream>
  2. #include <iostream>
  3. #include <list>
  4. using namespace std;
  5. typedef list<int> ListaEnteros;
  6.  
  7.  
  8.  
  9. int main()
  10. {
  11.  
  12.     ListaEnteros lista1;
  13.     lista1.push_back(1);
  14.     lista1.push_back(3);
  15.     lista1.push_back(5);
  16.     lista1.push_back(7);
  17.     lista1.push_back(9);
  18.     lista1.push_back(11);
  19.     lista1.push_back(13);
  20.     /***********guardar en fichero*******************/
  21.     int tamLista=lista1.size();
  22.     ofstream ofs("borrar.dat", ios::out|ios::binary);
  23.     ofs.write (reinterpret_cast<char*>(&tamLista),sizeof(int));
  24.     ofs.write (reinterpret_cast<char*>(&lista1),(tamLista*sizeof(int)));
  25.     ofs.close();
  26.     /*********recuperar de fichero***************/
  27.     ListaEnteros lista2;
  28.     int tamLista2;
  29.     ifstream ifs("borrar.dat",ios::in|ios::binary);
  30.     ifs.read(reinterpret_cast<char*>(&tamLista2),sizeof(int));
  31.     lista2.resize(tamLista2);
  32.     ifs.read(reinterpret_cast<char*>(&lista2),(tamLista2*sizeof(int)));
  33.     ifs.close();
  34.     /*********imprimir la lista*******************/
  35.     for (auto it=lista2.begin();it!=lista2.end();it++)
  36.     {
  37.         cout<<*it<<endl;
  38.     }
  39.  
  40.  
  41.     return 0;
  42.  
  43. }

Bueno, pues como siempre, gracias por adelantado
  #2 (permalink)  
Antiguo 23/09/2014, 03:37
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Guardar una lista en un fichero

Finalmente parece que no se pueden hacer atajos, así que me resigno a leer el contenido de la lista e ir guardándolos uno a uno, e igualmente, volver a crear la lista e ir insertando los valores...
Código C++:
Ver original
  1. ListaEnteros lista1;
  2.     lista1.push_back(1);
  3.     lista1.push_back(3);
  4.     lista1.push_back(5);
  5.     lista1.push_back(7);
  6.     lista1.push_back(9);
  7.     lista1.push_back(11);
  8.     lista1.push_back(13);
  9.     /***********guardar en fichero*******************/
  10.     int tamLista=lista1.size();
  11.     ofstream ofs("borrar.dat", ios::out|ios::binary);
  12.     ofs.write(reinterpret_cast<char*>(&tamLista),sizeof(int));
  13.  
  14.     for (auto it=lista1.begin();it!=lista1.end();++it)
  15.     {
  16.         ofs.write (reinterpret_cast<char*>(&*it),sizeof(int));
  17.     }
  18.     ofs.close();
  19.     /*********recuperar de fichero***************/
  20.     ListaEnteros lista2;
  21.     int tamLista2;
  22.     ifstream ifs("borrar.dat",ios::in|ios::binary);
  23.     ifs.read(reinterpret_cast<char*>(&tamLista2),sizeof(int));
  24.     int var=0;
  25.     for (int i=0;i<tamLista2;i++)
  26.     {
  27.         ifs.read(reinterpret_cast<char*>(&var),sizeof(int));
  28.         lista2.push_back(var);
  29.     }
  30.     ifs.close();
  31.     /*********imprimir la lista*******************/
  32.     for (auto it=lista2.begin();it!=lista2.end();it++)
  33.     {
  34.         cout<<*it<<endl;
  35.     }
  36.  return 0;
  37. }
  #3 (permalink)  
Antiguo 08/10/2014, 09:12
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Guardar una lista en un fichero

Cita:
Iniciado por dehm Ver Mensaje
Finalmente parece que no se pueden hacer atajos, así que me resigno a leer el contenido de la lista e ir guardándolos uno a uno, e igualmente, volver a crear la lista e ir insertando los valores...
No se pueden coger atajos por una razón muy sencilla: Los contenedores de C++ gestionan internamente memoria dinámica para almacenar los elementos que se les vayan pasando. Debido a esto, si tu vuelcas directamente la memoria del contenedor lo que consigues es guardar punteros en vez de información útil.

De hecho, a modo de ejemplo, el único contenido que almacena directamente el objeto "list" usado por mi compilador es la siguiente:

Código C++:
Ver original
  1. _Nodeptr _Myhead;   // pointer to head node
  2. size_type _Mysize;  // number of elements

Es decir, un puntero a la lista de elementos y una variable que indica cuantos elementos tiene la lista... y eso es lo que vas a guardar en el fichero si lo haces a lo bestia.

Al leer "a lo bestia" vas a insertar esta información a lo bruto en el nuevo contenedor y el resultado es el siguiente:

* Vas a crear lagunas de memoria. El contenedor en el que vayas a almacenar el contenido del fichero va a perder el puntero a la memoria que previamente ha reservado para sus propios fines, por lo que no podrá liberar esa memoria.

* Si la lectura la realizas una vez hayas destruido la lista original vas a acceder a memoria que no te corresponde.

* Si la lectura se realiza según tu primer ejemplo vas a conseguir que los dos contenedores apunten a la misma lista. El problema que genera esto es que si uno de los dos altera la lista el otro contenedor va a empezar a acceder a memoria no válida. En el caso concreto de tu programa los dos contenedores van a hacer delete sobre la misma región de memoria y el segundo va a dar error, lo cual es lógico.

Espero que esta explicación te aclare los motivos por los que no funcionaba tu primer ejemplo.

Un saludo.
  #4 (permalink)  
Antiguo 09/10/2014, 03:29
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Guardar una lista en un fichero

Muchas gracias por la explicación.
  #5 (permalink)  
Antiguo 09/10/2014, 03:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Guardar una lista en un fichero

De nada. A mandar :)

Etiquetas: fichero, int, lista
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:28.