Lo primero es que no utilices gets, es peligrosa y logra que tu programa sea propenso a errores, desbordamiento de buffer, etc. Utiliza fgets.
En cuanto al error, no he visto todo el código pero viendo la parte relevante a la pregunta en cuestión:
El error es sencillo, nunca debes utilizar feof de esa forma para comprobar el final de un archivo en un ciclo. feof devuelve verdadero después de pasar EOF, no al alcanzarlo.
Lo que sucede respectivamente es que fread lee el ultimo dato, pero no el final del archivo. Entonces al intentar leer nuevamente, se produce un error, y lo que haya quedado en el buffer se vuelve a imprimir porque la condición del ciclo, según feof, todavía no se ha cumplido.
No te pongo la función porque es fácil de solucionar y creo que va a ser mas productivo que la hagas vos mismo, pero como pista te digo que puedes valerte de una combinación de feof y el valor de retorno de fread, o bien solamente de este ultimo.
Recordando que el valor de retorno de fread implica:
Saludos
En cuanto al error, no he visto todo el código pero viendo la parte relevante a la pregunta en cuestión:
Código (c,line=1,1) [Seleccionar]
while(feof(fichero) == 0)
{
fread(&persona,1,sizeof(persona),fichero);
puts(persona.nombre);
}
El error es sencillo, nunca debes utilizar feof de esa forma para comprobar el final de un archivo en un ciclo. feof devuelve verdadero después de pasar EOF, no al alcanzarlo.
Lo que sucede respectivamente es que fread lee el ultimo dato, pero no el final del archivo. Entonces al intentar leer nuevamente, se produce un error, y lo que haya quedado en el buffer se vuelve a imprimir porque la condición del ciclo, según feof, todavía no se ha cumplido.
No te pongo la función porque es fácil de solucionar y creo que va a ser mas productivo que la hagas vos mismo, pero como pista te digo que puedes valerte de una combinación de feof y el valor de retorno de fread, o bien solamente de este ultimo.
Recordando que el valor de retorno de fread implica:
CitarReturn Value
The total number of elements successfully read is returned as a size_t object, which is an integral data type.
If this number differs from the count parameter, either an error occured or the End Of File was reached.
You can use either ferror or feof to check whether an error happened or the End-of-File was reached.
Saludos