Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/10/2014, 11:04
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como guardar un arreglo de objetos en un archivo

Código C++:
Ver original
  1. struct
  2. {
  3.   int matricula;
  4.   string nombre;
  5.   int edad;
  6. }alumno;

estás haciendo uso de la clase string. Esta clase hace, internamente, uso de memoria dinámica. Cuando tu haces:

Código C++:
Ver original
  1. fwrite(&alumno,sizeof(alumno),1,archdisco);

Estás cogiendo la memoria ocupada por "alumno" y la estás volcando directamente al fichero... el problema es que de "nombre" estás copiando un puntero y no la cadena almacenada en dicha clase.

Cuando recuperas el contenido del archivo, sobreescribes el estado del objeto "nombre", lo que sucede entonces es que consigues que su puntero interno apunte a donde alguna vez estuvo la cadena a la que apuntaba... pero esa porción de memoria ya no te pertenece y, muy posiblemente, haya sido sobreescrita por otro proceso o esté reservada.

Además, deberías evitar a toda costa hacer uso de fflush, al menos con buffers de entrada. Cito textual:

Cita:
If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file.

If stream is a null pointer, all such streams are flushed.

In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).
Es decir, fflush está pensado para buffers de saliday solo bajo ciertas condiciones... en el resto de circuntancias (y eso incluye buffers de entrada) el resultado puede ser impredecible.