Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ejercicio de fichero en lenguaje C

Estas en el tema de ejercicio de fichero en lenguaje C en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 31/03/2010, 05:03
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
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.
  #2 (permalink)  
Antiguo 31/03/2010, 11:35
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: ejercicio de fichero en lenguaje C

La macro LEE_CAD no tiene los parentesis/llaves balanceados.
  #3 (permalink)  
Antiguo 01/04/2010, 07:13
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

Hola, lo de los paréntesis de la macro LEE_CAD lo he solucionado, gracias por decírmelo, pero ahra el problema es cuando lo compilo que no funciona bien. A continuación te muestro la compilación a ver si me puedes ayudar a encontrar el fallo. Gracias.

a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): a

Num de telefono del abonado: 635100833
Nombre completo: Ana
Valor de la factura: 25.12
a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): a

Num de telefono del abonado: 964461273
Nombre completo: Carlos
Valor de la factura: 45.15
a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): a

Num de telefono del abonado: 964471715
Nombre completo: Daniel
Valor de la factura: 74.26

a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): b

Telefono del abonado a buscar/modificar: 964471715
Abonado encontrado:
Carlos
964471715
58.820000
Modificar factura (s/n)?s
Valor de la factura: 15.22

a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): f

Telefono del abonado a facturar: 964471715

La factura es de: 58.82
a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): t

La factura total es: 404.38
a--> Alta
b--> Buscar/Modificar ficha
f--> Factura abonado
t--> Factura Total
x--> Borrar Fichero y salir
m--> Mostrar todo el fichero
Elija opcion(s--> Salir): m

635100833 carlos 35.12

655452213 ana 74.22

541123325 55.65 12.12

635100833 Ana 25.25

964461273 Bea 54.32

964471715 Carlos 58.82

635100833 Ana 25.12

964461273 Carlos 45.15

964471715 Daniel 74.26

Lo que no entiendo es por qué me salen más clientes de la cuenta si yo sólo he introducido 3, cuando introduzco el teléfono a buscar de un cliente para modificar la factura el nombre que me sale es otro no el que yo he puesto y con el valor de la factura me pasa lo mismo, cuando pido mostrar la factura de un solo cliente tampoco coincide con la que yo le he dado.
  #4 (permalink)  
Antiguo 02/04/2010, 05:25
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

Hola, en este ejercicio al compilarlo como resultado no veo que me haya modificado la factura del cliente. Por una parte sólo se me crea el fichero binario fact_telefon.dat en el cual no hay que modificar la factura, pero no me deja abrirlo. Por otro lado no se me crea el fichero binario fact_telefon.aux en el cual se realiza la modificación de la factura.
Para que se me entienda mejor:

En el fichero binario fact_telefon.dat almacenamos los registros con los datos de los clientes incluyendo el valor de la factura.

En el fichero binario fact_telefon.aux guardamos otra vez los datos de los clientes, pero esta vez modificando la factura de un cliente en concreto.

Alguien puede echarme una mano, por favor, hace días que estoy con el mismo ejercicio. Gracias.
  #5 (permalink)  
Antiguo 09/04/2010, 10:41
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

¿Alguien puede ayudarme con este ejercicio?. Gracias.
  #6 (permalink)  
Antiguo 09/04/2010, 21:46
aguirremanuel
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de fichero en lenguaje C

Cita:
Iniciado por minette1988 Ver Mensaje
Lo que no entiendo es por qué me salen más clientes de la cuenta si yo sólo he introducido 3
Mi pana creo que es porque en el archivo 'fact_telefon.dat' quedan datos guardados de una ejecucion anterior, lo que deberias hacer, es borrar todo el contenido del archivo al comienzo del programa ó eliminar el archivo al comienzo del programa y luego lo vuelves a crear.

Saludos...
  #7 (permalink)  
Antiguo 10/04/2010, 10:52
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

Hola, eso ya lo he solucionado, pero ahora el problema es el siguiente: una vez doy de alta a todos los clientes y doy la opción b de buscar el cliente para modificar su factura pongo el teléfono del cliente y me salen sus datos. A continuación me pide si quiero modificar la factura pongo que sí, he introduzco el valor de la nueva factura. Hasta ahí bien, pero cuando doy la opción f de facturar un cliente introduzco el teléfono del cliente al cual acabo de modificar la factura y me sale como precio de la factura el valor original no el nuevo que es el que yo he modificado. Lo mismo me pasa cuando doy la opción m de mostrar todo, es decir me salen todos los registros, pero el valor de la factura del cliente que había modificado anteriormente no se ve reflejado aquí, sino que aparece el valor que tenía antes de la modificación. Espero haberme explicado con claridad.
  #8 (permalink)  
Antiguo 10/04/2010, 11:58
aguirremanuel
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de fichero en lenguaje C

Bueno estube viendo y lo que hay es que cerrar el archivo 'fact_telefon.dat' antes de eliminarlo, porque sino no lo elimina. es decir, antes de estas instrucciones :

Código:
remove("fact_telefon.dat");
rename("fact_telefon.aux", "fact_telefon.dat");
debes cerrar el archivo "fact_telefon.dat" :

Código:
fclose(d);
remove("fact_telefon.dat");
rename("fact_telefon.aux", "fact_telefon.dat");
Con esa modificacion me funcionó al pelo.

Suerte y Saludos...!!!
  #9 (permalink)  
Antiguo 11/04/2010, 10:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: ejercicio de fichero en lenguaje C

Después del typedef al lado de cada función ¿por qué pone FILE con el asterisco solamente?, otra pregunta, después del switch en las funciones alta_fact, modif_fich, mostrar_todo, float fact_total y float_fact_uno justo al lado utiliza la variable d y no la variable pf que es la que está definida en el main. La variable cliente que está definida en la función alta_fact en el resto de funciones no se le da el mismo nombre sino que utiliza otro cl ¿por qué?. A ver si alguien puede explicármelo. Gracias.
  #10 (permalink)  
Antiguo 11/04/2010, 11:40
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
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
  #11 (permalink)  
Antiguo 11/04/2010, 11:59
aguirremanuel
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ejercicio de fichero en lenguaje C

Oye pense que el programa lo habias hecho tú ...

Te va a tocar leerte algun libro ó manuel de C, ya que las preguntas que haces indican que no tienes mucho conocimiento sobre el programa que publicaste y va a ser dificil que lo entiendas sin la parte teorica necesaria.

Lo de los "FILE con el asterisco solamente" se debe a que en los parametros de prototipos de funciones puede solamente indicarse el tipo de dato de cada parametro sin necesidad de especificar un nombre de identificador para los mismos, ejemplo :

Código C++:
Ver original
  1. int suma1( int , int); // en este prototipo solo indico el tipo de dato de los parametros
  2. int suma2( int a, int b ); // en este prototipo si indico el nombre de las variables

Cita:
después del switch en las funciones alta_fact, modif_fich, mostrar_todo, float fact_total y float_fact_uno justo al lado utiliza la variable d y no la variable pf que es la que está definida en el main
Eso tiene que ver con los parametros de las funciones, a la funcion no le importa el nombre de la variable que le pases, si no, el tipo de dato y el contenido dentro de dicha variables, luego la funcion guarda ese valor dentro de la variable "d" ( ya que d es el parametro de cada una de las funciones definidas en el programa) y asi trabaja con d en ves de con pf.

Con la ayuda de manuales, guias y libros lo entenderas mejor mi pana ...

Cita:
La variable cliente que está definida en la función alta_fact en el resto de funciones no se le da el mismo nombre sino que utiliza otro cl ¿por qué?
eso es porque tu le puedes dar el nombre que quieras a una variable (siempre y cuando sea una variable que cumpla con la sintaxis del lenguaje), eso al compilador no le interesa.

Saludos...!!!
  #12 (permalink)  
Antiguo 12/04/2010, 10:19
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 1 mes
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

Etiquetas: fichero, lenguaje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:06.