strlen() tiene internamente un contador... al pasarle un puntero empieza a recorrerlo hasta que encuentra un caracter nulo ('\0'), incrementando su contador interno por el camino. Una vez localizado este carácter devuelve el valor del contador.
Dicho esto, Buffer[strlen(Buffer)-1]='\0' va a eliminar SIEMPRE el último caracter de la secuencia leída. Es decir, si tenías 'HOLA\0' te vas a quedar con 'HOL\0'. No entiendo la utilidad de esa línea.
Y, por cierto, aquí te sucede lo mismo:
Código C:
Ver originalfgets(Datos
[X
].
Name,sizeof(Datos
[X
].
Name),stdin
); Datos
[X
].
Name[strlen(Datos
[X
].
Name)-1]='\0';
Seguimos...
Código C:
Ver original // ...
// ...
// ...
// ...
// ...
// ...
// ...
}
la condición del "while" no va a fallar nunca porque feof() no se actualiza hasta que no realizas una lectura fallida... y entre el último feof() del bucle y la condición del while no hay ningúna operación sobre el fichero...
puedes dejarlo como
o así
Código C:
Ver originaldo
{
// ...
// ...
// ...
// ...
// ...
// ...
// ...
// if(feof(Agenda)) break; <-- comentado
más que nada porque la condición del while, tal y como está el código, no va a devolver false en la vida.
No se si te has dado cuenta, pero te puedes ahorrar el uso de "Buffer"... primero haces una copia del fichero a "Buffer" y después copias ese mismo contenido de "Buffer" a la estructura "Datos"... ¿Por qué no haces una copia directa a "Datos"?
Algo así:
Por otro lado, no se si te has dado cuenta, pero "Buffer" tiene tamaño 200 y "Name", "Address" y "Email" tienen tamaño 100... si editas el archivo a mano y aumentas la longitud de uno de esos campos por encima de 100 vas a pisar memoria... para evitar eso puedes valerte de "sizeof"
Así te evitas el desbordamiento del buffer.
Otra cosilla: dado que utilizas 'X' para controlar el número máximo de elementos... "Algodon" es otra variable que te puedes ahorrar... básicamente cambia el if por:
Y listo.
Y, bueno, entiendo que este programa te funciona... ¿Qué problemas tienes al cambiar fgets por fread???