Ver Mensaje Individual
  #12 (permalink)  
Antiguo 12/04/2010, 10:19
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

Este es el mismo ejercicio, pero usando la función fseek:

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CAR(c)\
  6.     c=getchar();\
  7.     while((c=='\n') || (c==' ') || (c=='\t'))\
  8.       c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.              while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.              while ((c[i]!='\n') && (i < (n-1))){ \
  14.                 i++;\
  15.             c[i]=getchar(); }\
  16.              c[i]='\0'; }
  17.  
  18. typedef struct{
  19.     char tel[10];
  20.         char nom_completo[100];
  21.         float fact;
  22. } abonado;
  23.  
  24. void alta_fact(FILE *);
  25. void modif_fich(FILE *);
  26. void mostrar_todo(FILE *);
  27. float fact_total(FILE *);
  28. float fact_uno(FILE *);
  29.  
  30. int main(){
  31.   char op;
  32.   FILE * pf;
  33.  
  34.   if((pf=fopen("fact_telefon.dat","rb+")) == NULL){
  35.      fprintf(stderr,"Error al abrir el fichero de ejer_fichero3_sec\n");
  36.      exit(1); }
  37.  
  38.   do{
  39.      printf(" a--> Alta\n b--> Buscar/Modificar ficha\n f-->Factura abonado\n t--> Factura Total\n x--> Borrar Fichero y salir\n");
  40.      printf(" m--> Mostrar todo el fichero\nElija opcion(s--> Salir): ");
  41.      LEE_CAR(op);
  42.  
  43.      switch(op){
  44.         case 'a':
  45.         case 'A':{alta_fact(pf); break;}
  46.         case 'b':
  47.         case 'B':{modif_fich(pf); break;}
  48.         case 'm':
  49.         case 'M':{mostrar_todo(pf); break;}
  50.         case 'f':
  51.         case 'F':{printf("\n%s %.2f\n","La factura es de:",fact_uno(pf)); break;}
  52.         case 't':
  53.         case 'T':{printf("\n%s %.2f\n","La factura total es:",fact_total(pf)); break;}
  54.         case 'x':
  55.         case 'X':{fclose(pf); pf=NULL; remove("fact_telefon.dat"); op= 's'; break;}
  56.      } /* switch */
  57.    } while((op != 's') && (op != 'S'));
  58.    if(pf != NULL)
  59.      if(fclose(pf) == EOF)
  60.        fprintf(stderr,"Error al cerrar el fichero de ejer_fichero3_sec\n");
  61.    exit(0);
  62. } /* main() */
  63.  
  64. void alta_fact(FILE * d){
  65.   abonado cliente;
  66.  
  67.   /* Antes del alta hemos de ir al final del fichero por si
  68.      con el acceso directo el puntero esta en otra posicion */
  69.   fseek(d,0,SEEK_END);
  70.   printf("Num de telefono del abonado: ");
  71.   scanf("%9s",cliente.tel);
  72.   printf("Nombre completo: ");
  73.   LEE_CAD(cliente.nom_completo,100);
  74.   printf("Valor de la factura: ");
  75.   scanf("%f",&cliente.fact);
  76.   fwrite(&cliente,sizeof(cliente),1,d);
  77. } /* alta_fact() */
  78.  
  79. void modif_fich( FILE * d){
  80.   char op;
  81.   char tel[10];
  82.   abonado cl;
  83.   int comp;
  84.  
  85.   printf("Telefono del abonado a buscar/modificar: ");
  86.   scanf("%9s",tel);
  87.   rewind(d); /* Pone el puntero al principio del fichero */
  88.   fread(&cl,sizeof(cl),1,d);
  89.   comp=strcmp(cl.tel, tel);
  90.   while((comp != 0) && (!feof(d))){
  91.        fread(&cl,sizeof(cl),1,d);
  92.        comp=strcmp(cl.tel, tel);
  93.   }
  94.   if(comp == 0){
  95.        printf("Abonado encontrado:\n");
  96.        printf("%s\n%s\n%f\n",cl.nom_completo,cl.tel,cl.fact);
  97.        printf("Modificar factura (s/n)? ");
  98.        LEE_CAR(op);
  99.        if((op =='s') || (op == 'S')){
  100.           printf("Valor de la factura: ");
  101.           scanf("%f",&cl.fact);
  102.           /* Debemos RETROCEDER en el fichero
  103.              los bytes que tenga un registro
  104.              desde esta posicion; estamos en
  105.              el primer byte del registro siguiente */
  106.           fseek(d,-(sizeof(cl)),SEEK_CUR);
  107.           fwrite(&cl,sizeof(cl),1,d);
  108.        }
  109.   else{ printf("Abonado no encontrado\n"); }
  110.  }
  111. } /* modif_fich() */
  112.  
  113. void mostrar_todo(FILE * d){
  114.   abonado cl;
  115.   rewind(d);
  116.   fread(&cl,sizeof(cl),1,d);
  117.   while (!feof(d)){
  118.      printf("%s\t%s\t%.2f\n\n",cl.tel,cl.nom_completo,cl.fact);
  119.      fread(&cl,sizeof(cl),1,d);
  120.   }
  121. } /* mostrar_todo() */
  122.  
  123. float fact_total(FILE * d){
  124.   abonado cl;
  125.   float total=0.0;
  126.   rewind(d);
  127.   fread(&cl,sizeof(cl),1,d);
  128.   while (!feof(d)){
  129.      total+=cl.fact;
  130.      fread(&cl,sizeof(cl),1,d);
  131.   }
  132.   return(total);
  133. } /* fact_total */
  134.  
  135. float fact_uno(FILE * d){
  136.   char tel[10];
  137.   abonado cl;
  138.   int comp;
  139.   float total;
  140.  
  141.      printf("Telefono del abonado a facturar: ");
  142.      scanf("%9s",tel);
  143.      rewind(d); /* Pone el puntero al principio del fichero */
  144.      fread(&cl,sizeof(cl),1,d);
  145.      comp=strcmp(cl.tel, tel);
  146.      while((comp != 0) && (!feof(d))) {
  147.        fread(&cl,sizeof(cl),1,d);
  148.        comp=strcmp(cl.tel, tel);}
  149.      if(comp == 0)
  150.       total=cl.fact;
  151.      else{
  152.        printf("Abonado no encontrado\n");
  153.        total = -1;
  154.      }
  155.      return(total);
  156. } /* fact_uno() */

Cuando lo compilo me dice lo siguiente: Error al abrir el fichero de ejer_fichero3_sec