Supongamos, porque no lo has indicado, que la clase "T_ALUMNO" tiene la siguiente estructura:
Código C++:
Ver originalstruct T_ALUMNO
{
std::string nombre;
std::string apellidos;
int dni;
};
Entonces, con la siguiente línea:
Código C++:
Ver originalescritura.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 originalstruct string
{
char* ptr;
int bufferSize;
};
struct T_ALUMNO
{
string nombre;
string apellidos;
int dni;
};
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 originalescritura.write( alumnos[i].nombre );
escritura.write( alumnos[i].apellidos );
escritura.write( alumnos[i].dni );
Un saludo.