Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/11/2014, 03:59
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 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.