[ Foro de C ]
Hola Nacho no puedo visualizar el numero de persona solicitado en este ejercicio, haber si me das una mano.<br />
Este es el ejercicio:<br />
Ampliar el programa anterior para que use un ?array de structs?, de forma que se
puedan tener datos de 10 personas. Se deberá pedir al usuario los datos de las 10
personas y guardarlos en el fichero. Después se pedirá al usuario un número del 1 al 10
y se mostrarán los datos de la persona indicada por ese número, que se deberán leer
de fichero (1 será la primera ficha, y 10 será la última). Por ejemplo, si el usuario indica
que quiere ver los datos de la persona 3 (tercera), se deberá leer las dos primeras,
ignorando su contenido, y después leer la tercera, que sí se deberá mostrar.<br /><br />
Y este es mi fuente.<br />
#include <stdio.h>
struct datos
{
char nombre[20];
int edad;
char ciudad[40];
};
int main()
{
struct datos persona[4];
FILE* fichero;
int i,numero;
fichero=fopen("gente.dat","wt");
for (i=0; i<4; i++)
{
printf("nombre::");
gets(persona[i].nombre);
fprintf(fichero,"%s\n",persona[i].nombre);
printf("edad::");
scanf("%d",&persona[i].edad);
getchar();
fprintf(fichero,"%d\n",persona[i].edad);
printf("ciudad residencia::");
gets(persona[i].ciudad);
fprintf(fichero,"%s\n",persona[i].ciudad);
}
fclose(fichero);
printf("indique numero de persona a buscar::");
scanf("%d",&numero);
fichero=fopen("gente.dat","rt");
for (i=0; i<4; i++)
{
if (i==(numero-1))
{
fscanf(fichero,"%s",persona[i].nombre);
printf("nombre: %s\n",persona[i].nombre);
fscanf(fichero,"%d",&persona[i].edad);
printf("edad: %d\n",persona[i].edad);
fscanf(fichero,"%s",persona[i].ciudad);
printf("ciudad: %s\n",persona[i].ciudad);
}
}
fclose(fichero);
return 0;
}
No se que estoy haciendo mal.<br />
Saludos.<br />
Está casi perfecto (salvando detalles que creo que has eliminado por comodidad, como el detalle de que pides 4 datos en vez de 10).
Tienes un error y una cosa mejorable.
El error es que siempre te muestra la primera ficha, porque lees de fichero sólo cuando "i==(numero-1)". Deberías mostrar en ese caso, pero leer siempre.
Lo mejorable es que no hace falta que leas todos los registros: si hay 10 datos y quieres ver el tercero, basta con que leas 3 veces y ya puedes terminar la ejecución.
Creo que ya entendi, tengo que leer (con fscanf) dentro del bucle for y mostrar los datos dentro del bloque if. Es asi o no. Saludos desde Tailandia.
Hola nuevamente me he quedado estancado en un ejercicio. Como puedo visualizar solo los nombres. Los datos estan en un struct y se almacenan en un fichero "agenda,dat". Una de las opciones es visualizar solo los nombres de las personas.
No me sale, me echas una mano.
Saludos.
Este es mi fuente:
#include <stdio.h>
struct datos
{
char nombre[20];
char direccion[60];
char telfMovil[10];
char email[50];
short int dia,mes,anio;
};
int main()
{
struct datos fichas[2];
int i;
FILE *fichero;
fichero=fopen("agenda.dat","wt");
for (i=0; i<2; i++)
{
printf("persona nro %i\n",i);
printf("nombre::");
gets(fichas[i].nombre);
fputs(fichas[i].nombre,fichero);
printf("direccion::");
gets(fichas[i].direccion);
fputs(fichas[i].direccion,fichero);
printf("telefono movil::");
gets(fichas[i].telfMovil);
fputs(fichas[i].telfMovil,fichero);
printf("email::");
gets(fichas[i].email);
fputs(fichas[i].email,fichero);
printf("fecha de nacimiento dd/mm/aa::");
scanf("%hd %hd %hd",&fichas[i].dia,&fichas[i].mes,&fichas[i].anio);
fprintf(fichero,"%hd %hd %hd\n",fichas[i].dia,fichas[i].mes,fichas[i].anio);
getchar();
}
fclose(fichero);
fichero=fopen("agenda.dat","rt");
for (i=0; i<2; i++) /*aqui es donde quiero*/
{ /*mostrar solo los nombre*/
fgets(fichas[i].nombre,20,fichero);
/*fscanf(fichero,"%s",fichas[i].direccion);
fscanf(fichero,"%s",fichas[i].telfMovil);
fscanf(fichero,"%s",fichas[i].email);
fscanf(fichero,"%hd %hd %hd",&fichas[i].dia,&fichas[i].mes,&fichas[i].anio);*/
printf("nombre %s::\n",fichas[i].nombre);
}
fclose(fichero);
return 0;
}
Lo tienes casi hecho. Sólo tienes que quitar los comentarios de las últimas líneas: debes leer todos los datos, pero mostrar sólo los nombres.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)