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

[SOLUCIONADO] Escribir y leer archivo binario

Estas en el tema de Escribir y leer archivo binario en el foro de C/C++ en Foros del Web. Buenos días, tengo un array de estructuras y necesito guardarlo en un archivo y luego leerlo. Lo estoy haciendo de la siguiente forma pero no ...
  #1 (permalink)  
Antiguo 13/11/2014, 03:00
 
Fecha de Ingreso: mayo-2013
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Escribir y leer archivo binario

Buenos días,

tengo un array de estructuras y necesito guardarlo en un archivo y luego leerlo. Lo estoy haciendo de la siguiente forma pero no funciona.

Escritura

ofstream escritura("fichero.bin", ios::out | ios::binary); // Apertura como salida

if (escritura)
{
cout << "Apertura con éxito \n";
for (int i = 0; i < 5; i++)
{
escritura.write((char *)(&alumnos[i]),sizeof(T_ALUMNO));
}
}
else
{
cout << "No se ha podido abrir el fichero";
}
escritura.close();

Lectura

ifstream lectura("fichero.bin", ios::in | ios::binary);

if (!lectura)
{
cout << "No se ha podido abrir el fichero";
}
else
{
T_ALUMNO al[5];
while (!lectura.eof()) //Mientras no sea final de fichero
{
for (int i = 0; i < 5; i++)
{
lectura.read((char *)(&al[i]),sizeof(T_ASPIRANTE));
}}
lectura.close();

Agradecería un poco de ayuda, gracias!!!!
  #2 (permalink)  
Antiguo 13/11/2014, 03:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Escribir y leer archivo binario

Supongamos, porque no lo has indicado, que la clase "T_ALUMNO" tiene la siguiente estructura:

Código C++:
Ver original
  1. struct T_ALUMNO
  2. {
  3.   std::string nombre;
  4.   std::string apellidos;
  5.   int dni;
  6. };

Entonces, con la siguiente línea:

Código C++:
Ver original
  1. escritura.write((char *)(&alumnos[i]),sizeof(T_ALUMNO));

estás volcando el contenido literal de la memoria al fichero. El problema es que la clase "string" hace uso de memoria dinámica y, en consecuencia, el contenido de la memoria de T_ALUMNO es equivalente a esto (ojo, es una representación simplificada)

Código C++:
Ver original
  1. struct string
  2. {
  3.   char* ptr;
  4.   int bufferSize;
  5. };
  6.  
  7. struct T_ALUMNO
  8. {
  9.   string nombre;
  10.   string apellidos;
  11.   int dni;
  12. };

Es decir, estás almacenando en el fichero la dirección de memoria donde se encuentra la cadena de texto en vez de almacenar la propia cadena de texto.

Al leer el contenido del fichero, estás haciendo que el puntero interno de la clase "string" apunte a una dirección de memoria no válida por varias razones:
  • la clase "string" no está diseñada para compartir memoria. Esta clase gestiona su propia memoria y liberar dos veces la misma memoria es algo que no le mola al sistema operativo.
  • seguramente, en el momento de recuperar el puntero, la memoria donde originalmente se encontraba la cadena ahora pertenezca a otro proceso o esté sin inicializar (por ejemplo si se ha reiniciado el equipo)

Con todo esto, la única forma de escribir en el fichero sería guardar la clase elemento a elemento... algo así (simplificado):

Código C++:
Ver original
  1. escritura.write( alumnos[i].nombre );
  2. escritura.write( alumnos[i].apellidos );
  3. escritura.write( alumnos[i].dni );

Un saludo.
  #3 (permalink)  
Antiguo 13/11/2014, 04:56
 
Fecha de Ingreso: mayo-2013
Mensajes: 10
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Escribir y leer archivo binario

Muchas gracias, ya conseguí solucionarlo.

Saludos.

Etiquetas: binario, char, funcion, int
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 01:30.