[ Foro de C ]

Tema 9, Ejercicio 2

02-Aug-2012 13:14
Antonio Rodriguez
3 Respuestas

Hola de nuevo.

Aquí sigo, peleándome con punteros, structs y ficheros :D

Estoy intentando hacer el segundo ejercicio del tema 9 (página 138), que según he visto aquí http://www.aprendeaprogramar.com/mod/forum/discuss.php?d=313 tiene un problema de redacción en el enunciado, así que he intentado adaptarlo para dar uso a lo que hemos aprendido hasta ahora...

El fuente que adjunto está incompleto y tengo que modificar alguna cosa, pero compila sin dar errores, el problema lo tengo a la hora de añadir fichas nuevas. La primera ficha la crea bien, y los datos son correctos si salgo del programa, lo vuelvo a abrir y los leo (esta es una de las cosas que tengo que modificar, lo de salir del programa para leer los nuevos datos del fichero, lo haré una vez solucione este problema)
Pero en cuanto añado más fichas al fichero, los datos guardados son incorrectos, se sobreescriben los datos guardados anteriormente y en su lugar aparecen rutas de acceso a archivos (¿?) ¿Porqué funciona con la primera ficha pero luego deja de hacerlo?

Un saludo

/* Ejercicio 9.2
Mejorar la version de la agenda que leía todos los datos al principio de la
ejecución y guardaba todos los datos cuando terminabamos su uso (apartado 6.4) Esta
nueva version deberá estar preparada para manejar hasta 1000 fichas, pero sólo reservará
espacio para las que realmente sean necesarias

Ejercicio 6.7
Una agenda que maneje los siguientes datos: nombre, direccion, tlf movil, email y dia,
mes y año de nacimiento (estos tres ultimos datos deberan ser numeros enteros
cortos) Debera tener capacidad para 100 fichas. Se debera poder añadir un dato
nuevo, visualizar los nombres de las fichas existentes o mostrar todos los datos de una
persona (Se preguntará al usuario cual es el nombre de esa persona que quiere
visualizar) Al empezar el programa, leera los datos de un fichero llamado "agenda.dat"
(si existe) Al terminar, guardara todos los datos en ese fichero*/

#include <stdio.h>
#include <stdlib.h>


main()
{
struct ficha {
char nombre[50];
char direccion[50];
char movil[10];
char email[50];
short int cumpledia;
short int cumplemes;
int cumpleyear;
};

struct ficha *datos; /*para cargar en memoria los datos existentes en el fichero*/
struct ficha *nueva; /*para ir añadiendo fichas nuevas*/

FILE* fichero;
char agenda[80] ="agenda2.dat";
int numFichas=0;
int tamano=0;

char textotemporal[10];
int menu;
int i;

printf("Bienvenido a ATEGENDA 2000\n");
printf("Cargando datos...\n");

/* Calculamos cuántos datos hay actualmente en el fichero */
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No existe el fichero.\n");
}
else { /*si el fichero existe...*/
fseek(fichero, 0, 2); /*saltamos al final del fichero*/
tamano=ftell(fichero); /*tamaño total del fichero*/
numFichas=(tamano/sizeof(struct ficha));; /*El numero de fichas existentes es igual
a la longitud total del fichero entre el tamaño del struct "ficha" */
fclose(fichero); /*cerramos el fichero*/
printf("El numero de fichas existentes es %d\n", numFichas); /*Indicamos el numero de fichas que existen actualmente*/
printf("y el tamaño actual del fichero es de %d\n", tamano); /*y el tamaño del fichero*/
}

/*cargamos los datos existentes en el fichero*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("Comenzamos un fichero nuevo.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
fread(datos, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*Iniciamos el programa propiamente dicho*/
do{
printf("\nElige una opcion:\n");
printf("[1] Añadir ficha nueva\n");
printf("[2] Listado de nombres del fichero\n");
printf("[3] Listado total del fichero\n");
printf("[4] Mostrar los datos de una persona\n");
printf("[0] Salir\n");
gets(textotemporal);
sscanf(textotemporal, "%d", &menu);

switch (menu) {
case 1:
if (numFichas<1000) { /*si hay menos de 1000 fichas...*/
nueva= (struct ficha*) malloc (sizeof(struct ficha)); /*reservamos memoria para una ficha*/
if (nueva==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
printf("Introduce el nombre: ");/*pedimos datos...*/
gets(nueva->nombre);/*...y los vamos almacenando en su posición*/
printf("Introduce la direccion: ");
gets(nueva->direccion);
printf("Introduce el telefono: ");
gets(nueva->movil);
printf("Introduce el email: ");
gets(nueva->email);
printf("Introduce el dia de nacimiento: ");
scanf("%d", &nueva->cumpledia);
getchar();
printf("Introduce el mes de nacimiento: ");
scanf("%d", &nueva->cumplemes);
getchar();
printf("Introduce el año de nacimiento: ");
scanf("%d", &nueva->cumpleyear);
getchar();
numFichas++;

fichero = fopen(agenda, "ab"); /*abrimos el fichero*/
printf("fichero abierto\n");
fwrite(nueva, sizeof(struct ficha), 1, fichero); /*escribimos los datos de la ficha*/
printf("datos escritos\n");
fclose(fichero); /*cerramos el fichero*/
printf("fichero cerrado\n");
free(nueva); /*liberamos memoria*/
printf("memoria liberada\n");
} else printf("No hay sitio para mas fichas (maximo 1000)"); /*si hay mas de 1000 fichas, avisamos*/
break;

case 2:
printf("Los nombres existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s\n", (datos+i)->nombre);
}

break;

case 3:
printf("Los datos existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s vive en %s, su telefono es %s, su email es %s\ny su fecha de nacimiento es %d-%d-%d\n",
(datos+i)->nombre, (datos+i)->direccion, (datos+i)->movil, (datos+i)->email,
(datos+i)->cumpledia, (datos+i)->cumplemes, (datos+i)->cumpleyear);
}

break;

case 4:
printf("Escribe el nombre a buscar: ");
gets(textotemporal);

break;


case 0:
printf("Hasta la vista!");
free(datos);
break;

default:
printf("Opcion no valida");
break;

}
} while (menu != 0);


}


15-Aug-2012 18:19
Antonio Rodriguez

En ocasiones no hay cómo tomarse un par de semanas de descanso para mirar las cosas de otra forma y solucionar en 10 minutos un problema al que le habías dedicado horas :D

En concreto el problema era que me faltaba un contador a la hora de cargar los datos en memoria, una vez corregido esto el programa funciona correctamente:

while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}


También he solucionado lo de refrescar los datos cuando se introducen fichas nuevas, leyendo del fichero y cargando en memoria los datos cada vez que se hace una consulta. Funciona bien, pero esta parte se hace repetitiva a lo largo del programa, seguro que Nacho me dirá que sería más elegante hacer una función que se ocupe de esta tarea y llamarla cada vez que sea necesaria, pero intervienen demasiadas variables y no me atrevo a meterme en semejante berenjenal xD

En fin, el fuente queda como sigue:

/* Ejercicio 9.2
Mejorar la version de la agenda que leía todos los datos al principio de la
ejecución y guardaba todos los datos cuando terminabamos su uso (apartado 6.4) Esta
nueva version deberá estar preparada para manejar hasta 1000 fichas, pero sólo reservará
espacio para las que realmente sean necesarias

Ejercicio 6.7
Una agenda que maneje los siguientes datos: nombre, direccion, tlf movil, email y dia,
mes y año de nacimiento (estos tres ultimos datos deberan ser numeros enteros
cortos) Debera tener capacidad para 100 fichas. Se debera poder añadir un dato
nuevo, visualizar los nombres de las fichas existentes o mostrar todos los datos de una
persona (Se preguntará al usuario cual es el nombre de esa persona que quiere
visualizar) Al empezar el programa, leera los datos de un fichero llamado "agenda.dat"
(si existe) Al terminar, guardara todos los datos en ese fichero*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


main()
{
struct ficha {
char nombre[50];
char direccion[50];
char movil[10];
char email[50];
short int cumpledia;
short int cumplemes;
int cumpleyear;
};

struct ficha *datos; /*para cargar en memoria los datos existentes en el fichero*/
struct ficha *nueva; /*para ir añadiendo fichas nuevas*/

FILE* fichero;
char agenda[80] ="agenda2.dat";
int numFichas=0;
int tamano=0;

char textotemporal[10];
int menu;
int i;
int sindatos=0;

printf("Bienvenido a ATEGENDA 2000\n");
printf("Cargando datos...\n");

/* Calculamos cuántos datos hay actualmente en el fichero */
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No existe el fichero.\n");
}
else { /*si el fichero existe...*/
fseek(fichero, 0, 2); /*saltamos al final del fichero*/
tamano=ftell(fichero); /*tamaño total del fichero*/
numFichas=(tamano/sizeof(struct ficha));; /*El numero de fichas existentes es igual
a la longitud total del fichero entre el tamaño del struct "ficha" */
fclose(fichero); /*cerramos el fichero*/
printf("El numero de fichas existentes es %d\n", numFichas); /*Indicamos el numero de fichas que existen actualmente*/
printf("y el tamaño actual del fichero es de %d\n", tamano); /*y el tamaño del fichero*/
}

/*cargamos los datos existentes en el fichero*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("Comenzamos un fichero nuevo.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*Iniciamos el programa propiamente dicho*/
do{
printf("\nElige una opcion:\n");
printf("[1] Añadir ficha nueva\n");
printf("[2] Listado de nombres del fichero\n");
printf("[3] Listado total del fichero\n");
printf("[4] Mostrar los datos de una persona\n");
printf("[0] Salir\n");
gets(textotemporal);
sscanf(textotemporal, "%d", &menu);

switch (menu) {
case 1:
if (numFichas<1000) { /*si hay menos de 1000 fichas...*/
nueva= (struct ficha*) malloc (sizeof(struct ficha)); /*reservamos memoria para una ficha*/
if (nueva==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
printf("Introduce el nombre: ");/*pedimos datos...*/
gets(nueva->nombre);/*...y los vamos almacenando en su posición*/
printf("Introduce la direccion: ");
gets(nueva->direccion);
printf("Introduce el telefono: ");
gets(nueva->movil);
printf("Introduce el email: ");
gets(nueva->email);
printf("Introduce el dia de nacimiento: ");
scanf("%d", &nueva->cumpledia);
getchar();
printf("Introduce el mes de nacimiento: ");
scanf("%d", &nueva->cumplemes);
getchar();
printf("Introduce el año de nacimiento: ");
scanf("%d", &nueva->cumpleyear);
getchar();
numFichas++;

fichero = fopen(agenda, "ab"); /*abrimos el fichero*/
printf("fichero abierto\n");
fwrite(nueva, sizeof(struct ficha), 1, fichero); /*escribimos los datos de la ficha*/
printf("datos escritos\n");
fclose(fichero); /*cerramos el fichero*/
printf("fichero cerrado\n");
free(nueva); /*liberamos memoria*/
printf("memoria liberada\n");
} else printf("No hay sitio para mas fichas (maximo 1000)"); /*si hay mas de 1000 fichas, avisamos*/
break;

case 2:
/*Refrescamos los datos del fichero*/
free(datos); /*primero liberamos de la memoria los datos que había hasta ahora*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No hay datos.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*sacamos los datos por pantalla*/
printf("Los nombres existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s\n", (datos+i)->nombre);
}

break;

case 3:
/*Refrescamos los datos del fichero*/
free(datos); /*primero liberamos de la memoria los datos que había hasta ahora*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No hay datos.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*sacamos los datos por pantalla*/
printf("Los datos existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s vive en %s, su telefono es %s, su email es %s\ny su fecha de nacimiento es %d-%d-%d\n",
(datos+i)->nombre, (datos+i)->direccion, (datos+i)->movil, (datos+i)->email,
(datos+i)->cumpledia, (datos+i)->cumplemes, (datos+i)->cumpleyear);
}

break;

case 4:
/*Refrescamos los datos del fichero*/
free(datos); /*primero liberamos de la memoria los datos que había hasta ahora*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No hay datos.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++) /* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*sacamos los datos por pantalla*/
printf("Escribe el nombre a buscar: ");
gets(textotemporal);
sindatos = 0; /*Inicializamos la variable que nos dirá si ha encontrado coincidencias o no*/
for (i=0; i<numFichas; i++) {
if (strcmp((datos+i)->nombre, textotemporal)==0) {/*hacemos la comparacion, si existe el nombre escribimos los datos*/
printf("Los datos que disponemos para %s son:\n", textotemporal);
printf("%s vive en %s, su telefono es %s, su email es %s\ny su fecha de nacimiento es %d-%d-%d\n",
(datos+i)->nombre, (datos+i)->direccion, (datos+i)->movil, (datos+i)->email,
(datos+i)->cumpledia, (datos+i)->cumplemes, (datos+i)->cumpleyear);
sindatos++; /*y la variable sindatos cambia de valor*/
}
}
/*Si la variable sindatos sigue siendo igual a 0 es que no ha encontrado el nombre, cosa que indicamos*/
if (sindatos==0) printf("No se disponen de datos para %s.\n", textotemporal);

break;


case 0:
printf("Hasta la vista!");
free(datos);
break;

default:
printf("Opcion no valida");
break;

}
} while (menu != 0);


}


17-Aug-2012 15:42
Nacho Cabanes (+31)

Normalmente no hace falta llegar al par de semanas: basta con aplazarlo para el día siguiente. Es un consejo que suelo dar a mis alumnos: si algo no sale en media hora, suele ser mejor cambiar de ejercicio, cambiar de tarea (videojuegos, hacer algo en casa) o incluso salir a la calle (a hacer deporte, a tomar algo con los amigos) y desconectar. Al día siguiente, o a veces incluso un par de horas después, con la mente más fresca, las cosas salen mucho mejor.

En cuanto a tu fuente, efectivamente, es un poco repetitivo. Si lo descompones en funciones, no sólo será más legible, sino además más fácil de mantener y menos propenso a errores, porque cuando llegue el momento de hacer cambios, los harás en un único sitio (lo que evitar errores e inconsistencias por cambiar en un sitio pero no en otro).

(Eso me recuerda que tengo que revisar el enunciado de este ejercicio...)

¿Seguro que no te atreves a intentarlo?


24-Aug-2012 07:33
Antonio Rodriguez

Aprovechando el insomnio me he puesto con la función para recargar los datos y aligerar el fuente.

Lo he conseguido, pero con matices: Para facilitar el traspaso de datos de la función principal a la función "recarga" he declarado el struct ficha y la cadena donde se almacena el nombre del fichero como variables globales, con lo el fuente queda así:


/* Ejercicio 9.2
Mejorar la version de la agenda que leía todos los datos al principio de la
ejecución y guardaba todos los datos cuando terminabamos su uso (apartado 6.4) Esta
nueva version deberá estar preparada para manejar hasta 1000 fichas, pero sólo reservará
espacio para las que realmente sean necesarias

Ejercicio 6.7
Una agenda que maneje los siguientes datos: nombre, direccion, tlf movil, email y dia,
mes y año de nacimiento (estos tres ultimos datos deberan ser numeros enteros
cortos) Debera tener capacidad para 100 fichas. Se debera poder añadir un dato
nuevo, visualizar los nombres de las fichas existentes o mostrar todos los datos de una
persona (Se preguntará al usuario cual es el nombre de esa persona que quiere
visualizar) Al empezar el programa, leera los datos de un fichero llamado "agenda.dat"
(si existe) Al terminar, guardara todos los datos en ese fichero*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ficha {
char nombre[50];
char direccion[50];
char movil[10];
char email[50];
short int cumpledia;
short int cumplemes;
int cumpleyear;
};

char agenda[80] ="agenda2.dat";

void recarga (struct ficha *datos, int *numFichas) {
int i;
FILE *fichero;

free(datos); /*primero liberamos de la memoria los datos que había hasta ahora*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No hay datos.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * *numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i< *numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}
}

main(){

struct ficha *datos; /*para cargar en memoria los datos existentes en el fichero*/
struct ficha *nueva; /*para ir añadiendo fichas nuevas*/

FILE* fichero;
int numFichas=0;
int tamano=0;

char textotemporal[10];
int menu;
int i;
int sindatos=0;

printf("Bienvenido a ATEGENDA 2000\n");
printf("Cargando datos...\n");

/* Calculamos cuántos datos hay actualmente en el fichero */
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("No existe el fichero.\n");
}
else { /*si el fichero existe...*/
fseek(fichero, 0, 2); /*saltamos al final del fichero*/
tamano=ftell(fichero); /*tamaño total del fichero*/
numFichas=(tamano/sizeof(struct ficha));; /*El numero de fichas existentes es igual
a la longitud total del fichero entre el tamaño del struct "ficha" */
fclose(fichero); /*cerramos el fichero*/
printf("El numero de fichas existentes es %d\n", numFichas); /*Indicamos el numero de fichas que existen actualmente*/
printf("y el tamaño actual del fichero es de %d\n", tamano); /*y el tamaño del fichero*/
}

/*cargamos los datos existentes en el fichero*/
fichero = fopen(agenda, "rb"); /*abrimos el fichero en modo lectura*/
if (fichero==NULL) { /*si el fichero no existe...*/
printf("Comenzamos un fichero nuevo.\n");
}
else { /*si el fichero existe...*/
datos = (struct ficha*) malloc (sizeof(struct ficha) * numFichas); /*Reservamos el espacio para las fichas existentes*/
if (datos==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
while (!feof(fichero)) { /*Leemos todos los datos hasta el final del fichero*/
for (i=0; i<numFichas; i++)/* y los cargamos en la memoria que hemos reservado*/
fread(datos+i, sizeof(struct ficha), 1, fichero);
}
fclose(fichero); /*Cerramos el fichero*/
}

/*Iniciamos el programa propiamente dicho*/
do{
printf("\nElige una opcion:\n");
printf("[1] Añadir ficha nueva\n");
printf("[2] Listado de nombres del fichero\n");
printf("[3] Listado total del fichero\n");
printf("[4] Mostrar los datos de una persona\n");
printf("[0] Salir\n");
gets(textotemporal);
sscanf(textotemporal, "%d", &menu);

switch (menu) {
case 1:
if (numFichas<1000) { /*si hay menos de 1000 fichas...*/
nueva= (struct ficha*) malloc (sizeof(struct ficha)); /*reservamos memoria para una ficha*/
if (nueva==NULL) { /*Si no hay espacio suficiente, salimos del programa*/
printf("No hay suficiente espacio en memoria\n");
exit(1);
}
printf("Introduce el nombre: ");/*pedimos datos...*/
gets(nueva->nombre);/*...y los vamos almacenando en su posición*/
printf("Introduce la direccion: ");
gets(nueva->direccion);
printf("Introduce el telefono: ");
gets(nueva->movil);
printf("Introduce el email: ");
gets(nueva->email);
printf("Introduce el dia de nacimiento: ");
scanf("%d", &nueva->cumpledia);
getchar();
printf("Introduce el mes de nacimiento: ");
scanf("%d", &nueva->cumplemes);
getchar();
printf("Introduce el año de nacimiento: ");
scanf("%d", &nueva->cumpleyear);
getchar();
numFichas++;

fichero = fopen(agenda, "ab"); /*abrimos el fichero*/
fwrite(nueva, sizeof(struct ficha), 1, fichero); /*escribimos los datos de la ficha*/
fclose(fichero); /*cerramos el fichero*/
free(nueva); /*liberamos memoria*/
} else printf("No hay sitio para mas fichas (maximo 1000)"); /*si hay mas de 1000 fichas, avisamos*/
break;

case 2:
/*Refrescamos los datos del fichero*/
recarga (datos, &numFichas); /*usamos la funcion que hemos definido para cargar nuevamente los datos*/

/*sacamos los datos por pantalla*/
printf("Los nombres existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s\n", (datos+i)->nombre);
}
break;

case 3:
/*Refrescamos los datos del fichero*/
recarga (datos, &numFichas); /*usamos la funcion que hemos definido para cargar nuevamente los datos*/

/*sacamos los datos por pantalla*/
printf("Los datos existentes son:\n");
for (i=0; i<numFichas; i++) {
printf("%s vive en %s, su telefono es %s, su email es %s\ny su fecha de nacimiento es %d-%d-%d\n",
(datos+i)->nombre, (datos+i)->direccion, (datos+i)->movil, (datos+i)->email,
(datos+i)->cumpledia, (datos+i)->cumplemes, (datos+i)->cumpleyear);
}
break;

case 4:
/*Refrescamos los datos del fichero*/
recarga (datos, &numFichas); /*usamos la funcion que hemos definido para cargar nuevamente los datos*/

/*sacamos los datos por pantalla*/
printf("Escribe el nombre a buscar: ");
gets(textotemporal);
sindatos = 0; /*Inicializamos la variable que nos dirá si ha encontrado coincidencias o no*/
for (i=0; i<numFichas; i++) {
if (strcmp((datos+i)->nombre, textotemporal)==0) {/*hacemos la comparacion, si existe el nombre escribimos los datos*/
printf("Los datos que disponemos para %s son:\n", textotemporal);
printf("%s vive en %s, su telefono es %s, su email es %s\ny su fecha de nacimiento es %d-%d-%d\n",
(datos+i)->nombre, (datos+i)->direccion, (datos+i)->movil, (datos+i)->email,
(datos+i)->cumpledia, (datos+i)->cumplemes, (datos+i)->cumpleyear);
sindatos++; /*y la variable sindatos cambia de valor*/
}
}
/*Si la variable sindatos sigue siendo igual a 0 es que no ha encontrado el nombre, cosa que indicamos*/
if (sindatos==0) printf("No se disponen de datos para %s.\n", textotemporal);
break;

case 0:
printf("Hasta la vista!");
free(datos);
break;

default:
printf("Opcion no valida");
break;

}
} while (menu != 0);

}



PD: En caso de que haya hecho demasiadas trampas declarando las variables como globales la culpa es de la falta de sueño xD






(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.)