[ Foro de C ]

Agenda version final

11-Feb-2012 18:14
bruno zelaia montero
1 Respuestas

Aquí os expongo mi codigo, por si le puede ser de ayuda a alguien, sentiros libres de criticarlo al ser posible de forma constructiva
(yo me sentiré libre de perseguiros con una motosierra cual matanza de Texas...es broma ;) )

Adjuntado esta!

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

struct{
      char nombre[30];
      char direccion[30];
      char movil[10];
      char email[30];
      short int dia, mes, anyo;
      }persona;

int main (void)
{
    char aux_text[60]; /* variable provisional de texto */
    int opcion=0; /* para el menu de opciones */
    FILE* fichero; /* donde guardaremos la DB */
    int cont=0; /*contador de fichas */
    int longfich=0; /* para medir los archivos y tener claras las posiciones */
    int i; /*bucles como siempre */
    char c;
   
    fichero=fopen("agenda.dat","ab");
    fseek(fichero,0,SEEK_END);
    longfich=ftell(fichero);
    cont=(longfich /106); /* Sabemos que es 106 porque es la suma de 30 nombre,movil y email
                       c.u,10 mas por movil, y 2 bytes mas dia mes y anyo c.u en total 106 */
    fclose(fichero);
    printf("Longitud de fichero: %d \n",longfich);
    printf("fichas almacenadas: %d \n",cont);
    if (cont==0) puts ("Base de datos no encontrada,creando nueva base de datos...");
    else puts("Cargando la base de datos..."); /* mentira vil pero me mola pq queda mas pro y yo lo valgo */
    puts("Primera parte del programa finalizada con exito aprete una tecla para entrar al menu");
    getchar();
do{
         puts(" <-*-*-*-^^^-<<< AGENDA GOLD EDITION >>>-^^^-*-*-*-> \n");
         puts(" Escoja una opcion de las siguientes:\n");
         puts("1.Anyadir nueva ficha (si no habian anteriores se creara la DB tambien)");
         puts("2.Mostrar todas las fichas");
         puts("3.Ver una ficha (se buscara por nombre)");
         puts("4.Editar una ficha (habra que conocer primero el numero de ficha a editar)");
         puts("5.mostrar todas las fichas");
         puts("6.Salir");
         printf("Seleccione una opcion por favor: ");
         scanf("%d",&opcion);
         getchar(); /* para "absorber" el intro de scanf */
         switch (opcion)
         {
                case 1:
                     if (cont<100)
                     {
                     fichero=fopen("agenda.dat","ab");
                     puts("Introduzca el nombre de la persona:");
                     gets(persona.nombre);
                     puts("Introduzca la direccion de la persona:");
                     gets(persona.direccion);
                     puts("Introduzca el numero de movil:");
                     gets(persona.movil);
                     puts("Introduzca el email:");
                     gets(persona.email);
                     printf("Introduzca el dia de nacimiento(dd):\n");
                     scanf("%d",&persona.dia);
                     getchar();
                     printf("Introduzca el mes de nacimiento(mm):\n");
                     scanf("%d",&persona.mes);
                     getchar();
                     printf("Introduzca el anyo de nacimiento(aa):\n");
                     scanf("%d",&persona.anyo);
                     getchar();
                     fwrite(&persona,sizeof(persona),1,fichero);
                     puts("Ficha anyadida pulse una tecla para continuar");
                     getchar();
                     cont ++;
                     fclose(fichero);
                     }
                     else puts("Maximo de 100 fichas alcanzado");
                     break;
               
                case 2:
                     fichero=fopen("agenda.dat","rb");
                     fseek(fichero,0,SEEK_SET);
                     for (i=0;i<cont;i++)
                     {
                         fseek(fichero,0,SEEK_CUR);
                         fread(&persona,1,sizeof(persona),fichero);
                         printf("%d : %s\n",i+1, persona.nombre);
                     }
                     printf("Pulse una tecla para continuar");
                     fclose(fichero);
                     getchar();
                     break;
                         
                     
                case 3:
                     puts("Introduzca el nombre de la persona a buscar");
                     gets(aux_text);
                     fichero=fopen("agenda.dat","rb");
                     for (i=0;i<cont;i++)
                     {     fseek(fichero,0,SEEK_CUR); /* desde la actual pq si fuese siempre desde la primera mirariamos siempre la misma */
                           fread(&persona,1,sizeof(persona),fichero);
                           if (strcmp(persona.nombre,aux_text)==0)
                           {
                           printf("ficha n %d\n",i+1);
                           puts(persona.nombre);
                           puts(persona.direccion);
                           puts(persona.movil);
                           puts(persona.email);
                           printf("Nacido el %d del %d del %4d\n",persona.dia,persona.mes,persona.anyo);
                           }
                     }
                     fclose (fichero);
                     if (strcmp(persona.nombre,aux_text)!=0)
                           puts("El nombre no coincide con ninguno de la lista");
                     break;
                     
                case 4:
                     puts("Introduzca el numero de ficha que quiere editar");
                     scanf("%d",&i);
                     if (i>cont)
                                {printf("El numero de ficha no existe,intentelo de nuevo\n");
                                }
                     else
                     {  
                     printf("Informacion ficha n %d : \n\n",i);  
                     i=(i-1)*106;
                     //chivato de i//
                     printf("%d",i);
                     fichero=fopen("agenda.dat","rb");
                     fseek(fichero,i,SEEK_SET);
                     fread(&persona,1,sizeof(persona),fichero);
                     puts(persona.nombre);
                     puts(persona.direccion);
                     puts(persona.movil);
                     puts(persona.email);
                     printf("Nacido el %d del %d del %4d\n",persona.dia,persona.mes,persona.anyo);
                     }
                     printf("Cuando haya finalizado la lectura aprete una tecla para continuar\n");
                     fclose(fichero);
                     getchar();
                     //Aqui empieza lo que sera la modificacion de datos//
                     puts("Introduzca la correccion del nombre o dejelo en blanco si desea que no se edite");
                     gets(aux_text);
                     if (strcmp(aux_text,"")==0) puts("No modificado");
                     else (strcpy(persona.nombre,aux_text));
                     puts ("Introduzca la nueva direccion (enter en blanco para no editar)");
                     gets(aux_text);
                     if (strcmp(aux_text,"")==0) puts("No modificado");
                     else (strcpy(persona.direccion,aux_text));
                     puts ("Introduzca el numero de movil nuevo o enter en blanco para no editar");
                     gets(aux_text);
                     if (strcmp(aux_text,"")==0) puts ("No modificado");
                     else (strcpy(persona.movil,aux_text));
                     puts ("Introduzca el nuevo email o pulse enter en blanco para no editar");
                     gets(aux_text);
                     if (strcmp(aux_text,"")==0) puts ("No modificado");
                     else (strcpy(persona.email,aux_text));
                     
                     //Aqui mostramos ahora como quedaria//
                     puts("Resumen de los datos, estos quedaran guardados de la siguiente manera:");
                     puts(persona.nombre);
                     puts(persona.direccion);
                     puts(persona.movil);
                     puts(persona.email);
                     printf("Nacido el %d del %d del %4d\n",persona.dia,persona.mes,persona.anyo);
                     puts("Quiere proceder a guardar los datos? S/N");
                     scanf("%c",&c);
                     getchar();
                     if (c=='s')
                     {
                     printf("%c",c);
                     fichero=fopen("agenda.dat","r+b");
                     fseek(fichero,i,SEEK_SET);
                     fwrite(&persona,sizeof(persona),1,fichero);
                     fclose(fichero);
                     puts("escribiendo datos...");
                     }
                     else break;
                     puts("Cambios guardados pulse una tecla para finalizar");
                     getchar();
                     break;
                     
                case 5:
                     fichero=fopen("agenda.dat","rb");
                     for (i=0;i<cont;i++)
                     {
                         fseek(fichero,0,SEEK_CUR);
                         fread(&persona,1,sizeof(persona),fichero);
                         puts(persona.nombre);
                         puts(persona.direccion);
                         puts(persona.movil);
                         puts(persona.email);
                         printf("Nacido el %d del %d del %4d\n",persona.dia,persona.mes,persona.anyo);
                         puts("aprete una tecla para ver el siguiente");
                         getchar();
                     }
                     break;
                     
               
                default:
                        puts("Opcion incorrecta, por favor intentelo de nuevo");
                        break;
               
               
                     
}
}
while(opcion!=6);
}


12-Feb-2012 01:21
Nacho Cabanes (+83)

Un par de pequeñas mejoras:

- Mantén el fichero abierto el menor tiempo posible. En vez de hacer

fichero=fopen("agenda.dat","ab");
puts...
gets...
...
fwrite(&persona,sizeof(persona),1,fichero);
getchar();
fclose(fichero);

haz algo como


puts...
gets...
...
fichero=fopen("agenda.dat","ab");
fwrite(&persona,sizeof(persona),1,fichero);
fclose(fichero);

getchar();



- Los " fseek(fichero,0,SEEK_CUR);" son innecesarios: avanzas cero desde la posición actual, o sea, te quedas donde estabas.  ;-)



- Y ya que estamos, otra poco importante, más relativa a estilo que a otra cosa: evita los "números mágicos": en vez de 100 para el máximo de fichas, usa una constante llamada MAX_FICHAS y en vez de 106 para el tamaño del struct (que está en un comentario), usa "sizeof". Así, si cambias el tamaño del struct, todo seguirá funcionando correctamente (en un fichero de datos nuevo ;-D ).






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