Ver Mensaje Individual
  #7 (permalink)  
Antiguo 01/04/2015, 00:15
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problema en C con fread y fwrite

Código C:
Ver original
  1. fread(&Datos,sizeof(Agenda),1,Agenda);

¿Y que tal?

Código C:
Ver original
  1. fread(&Datos,sizeof(Datos),1,Agenda);

"Agenda" es un puntero, luego "sizeof(Agenda)" te va a devolver el tamaño que ocupa en memoria un puntero... es decir, seguramente 32 bits. Y esto va a ser así para cualquier puntero... todos los punteors ocupan lo mismo en memoria, ya que un puntero no es más que una referencia a otra posición de la memoria... además, la cantidad de datos a leer no va a venir determinada por "Agenda", sino por "Datos".

Con eso deberías ser capaz de leer el fichero... pero no vas a ser capaz de identificar cuántos elementos hay... Al guardar te vas a limitar a volcar en el fichero el contenido de la memoria de "Datos"... pero "Datos" no tiene nada que te permita saber cuántos elementos hay en la agenda.

Para solucionar este inconveniente tienes varias opciones:

1. Al empezar el programa, reinicias la memoria de "Datos", es decir, pones todos sus bytes a 0. ¿Para qué? Pues para que los registros que no tengan datos válidos no tengan basura. Dado que todos los registros van a estar consecutivos, basta con encontrar el primer registro con, por ejemplo, el nombre vacío para saber dónde termina la lista.

Resetear la memoria puede ser tan sencillo como:

Código C:
Ver original
  1. memset( &Datos, 0, sizeof(Datos) );

2. Modificar "Datos" para que pueda almacenar una variable que indique el número de elementos:

Código C:
Ver original
  1. struct Registro
  2. {
  3.     char Name[100],Adress[100],Email[100],Movil[13];
  4.     unsigned short int Day,Month,Year;
  5. };
  6.  
  7. struct Datos
  8. {
  9.   struct Registro Entradas[100];
  10.   int numEntradas;
  11. };

Con esta opción tienes que modificar todos los accesos a "Datos", pero ahí tendrás, en numEntradas, un valor que te indicará cuántos elementos estás almacenando en "Datos".

3. Hacer una lectura por pasos tal y como estabas haciendo con fgets. Una forma puede ser guardar cada Datos[x] en cada pasada:

Código C:
Ver original
  1. fwrite( &Datos[x], sizeof(Datos[0]), 1, Agenda);

Y la operación equivalente para leer... en este caso te basta con comprobar "feof()" después de cada lectura para saber si el último registro se ha leído correctamente o no.

Un saludo.