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

Hola, el ejercicio dice así: La compañía telefónica tiene un fichero que guarda las facturas correspondientes a sus abonados; se desea un programa en C para gestionarlo. Las operaciones serán:

- Alta de nuevas facturas.
- Comprobar una ficha y modificarla.
- Facturación total o de un solo abonado.
- Borrar el fichero.

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

Cuado lo compilo me da el siguiente error: En la función ‘alta_fact’: 167: error: expected declaration or statement at end of input. Sin embargo lo he revisado bien y yo no veo que le falte ninguna llave.