¿Y que tal?
"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:
2. Modificar "Datos" para que pueda almacenar una variable que indique el número de elementos:
Código C:
Ver originalstruct Registro
{
char Name[100],Adress[100],Email[100],Movil[13];
unsigned short int Day,Month,Year;
};
struct Datos
{
struct Registro Entradas[100];
int numEntradas;
};
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:
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.