El problema se genera por la forma en que guardas los datos en el archivo:
/*Escribo el archivo*/
printf("Introduzca nombre: "); fprintf(fichero
,"%s",persona.
nombre);
printf("Introduzca ciudad: "); fprintf(fichero
,"%s",persona.
ciudad);
scanf("%d",&persona.
edad); fprintf(fichero
,"%d",persona.
edad);
Por ejemplo si el nombre es "X", la ciudad "Y" y la edad "5" los datos se envían
sin separación alguna como la secuencia "XY5".
Para solucionarlo debes enviar cada campo seguido de un avance de linea:
/*Escribo el archivo*/
printf("Introduzca nombre: "); fprintf(fichero
, "%s\n", persona.
nombre);
printf("Introduzca ciudad: "); fprintf(fichero
, "%s\n", persona.
ciudad);
scanf("%d", &persona.
edad); fprintf(fichero
, "%d\n", persona.
edad);
Otros errores que debes corregir:
* Antes de utilizar la función exit debes incluir el encabezado <stdlib.h>.
* No puedes imprimir un entero (la edad) con la función puts:
fscanf(fichero
,"%d",&persona.
edad);
En lugar de puts utiliza printf.
* Después de leer el ultimo campo de tipo int (de nuevo la edad) debes descartar el resto de la linea.
* La condición del bucle de lectura garantiza un iteración de mas, en otras palabras si tienes un registro se trataran de mostrar dos. Para evitarlo debes verificar (por lo menos) el resultado de la lectura del primer campo. Combinado con el punto anterior:
while (fgets(persona.
nombre, 40, fichero
) != NULL
){
fgets(persona.
ciudad, 40, fichero
);
fscanf(fichero
,"%d",&persona.
edad);
{
int ch;
while ((ch
= fgetc(fichero
)) != EOF
&& ch
!= '\n') ;
}
}
Por ultimo debes evitar el uso de magic numbers y las funciones gets y feof. Mas información en la pagina
|Lo que no hay que hacer en C/C++. Nivel basico|.
Un saludo