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#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*LEE_CAD permite escribir los nombres con espacios en blanco*/
#define LEE_CAD(c,n) { int i=0;\
c[i]=getchar();\
while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
while((c[i]!='\n') && (i < (n-1))){ \
i++;\
c[i]='\0';}
typedef struct{
char tel[10];
char nom_completo[100];
float fact;
}abonado;
void alta_fact(FILE *);
void modif_fich(FILE *);
void mostrar_todo(FILE *);
float fact_total(FILE *);
float fact_uno(FILE *);
int main(){
char op;
FILE *pf;
if((pf
=fopen("fact_telefon.dat", "ab+")) == NULL
){ fprintf(stderr
, "Erroe Fichero y salir\n");
do{
printf("a--> Alta\n b--> Buscar/Modificar ficha\n f--> Factura abonado\n t--> Factura Total\n x--> Borrar Fichero y salir\n"); printf("m--> Mostrar todo el fichero\n Elija una opcion(s--> Salir): "); LEE_CAR(op);
switch(op){
case 'a':
case 'A':{alta_fact(pf); break;}
case 'b':
case 'B':{modif_fich(pf); break;}
case 'm':
case 'M':{mostrar_todo(pf); break;}
case 'f':
case 'F':{printf("\n%s %.2f\n", "La factura es de:", fact_uno
(pf
)); break;} case 't':
case 'T':{printf("\n%s %.2f\n", "La factura total es:", fact_total
(pf
)); break;} case 'x':
case 'X':{fclose(pf
); pf
=NULL
; remove("fact_telefon.dat"); op
= 's'; break;} }
}while((op != 's') && (op != 'S'));
if(pf != NULL)
fprintf(stderr
, "Error al cerrar el fichero de ejer_fichero3_sec\n"); }
void alta_fact(FILE * d){
abonado cliente;
printf(" Num de telefono del abonado: "); scanf("%9s", cliente.
tel); LEE_CAD(cliente.nom_completo, 100);
printf("Valor de la factura: "); scanf("%f", &cliente.
fact); fwrite(&cliente
,sizeof(cliente
),1,d
); }
void modif_fich(FILE * d){
char op;
char tel[10];
abonado cl;
int comp;
FILE * aux;/*Fichero auxiliar por si modifica la ficha del abonado*/
if((aux
=fopen("fact_telefon.aux", "wb+")) != NULL
){ printf("Telefono del abonado a buscar/modificar: "); fread(&cl
,sizeof(cl
),1,d
); while((comp
!= 0) && (!feof(d
))){ fread(&cl
,sizeof(cl
),1,d
); if(comp == 0){
printf("Abonado encontrado:\n"); printf("%s\n%s\n%f\n", cl.
nom_completo, cl.
tel, cl.
fact); printf("Modificar factura (s/n)?"); LEER_CAR(op);
if((op == 's') || (op == 'S')){
printf("Valor de la factura: "); fread(&cl
,sizeof(cl
),1,d
); fread(&cl
,sizeof(cl
),1,d
);} fprintf(stderr
, "Error al cerrar el fichero auxiliar de ejer_fichero3_sec\n"); rename("fact_telefon.aux", "fact_telefon.dat"); if((d
=fopen("fact_telefon.dat", "ab+")) == NULL
){ fprintf(stderr
, "Error al cerrar el fichero de ejer_fichero3_sec\n"); }
else{
fprintf(stderr
, "Error al cerrar el fichero auxiliar de ejer_fichero3_sec\n"); }
}
else{
printf("Abonado no encontrado\n"); fprintf(stderr
, "Error al cerrar el fichero auxiliar de ejer_fichero3_sec\n"); }
}
}
void mostrar_todo(FILE * d){
abonado cl;
fread(&cl
,sizeof(cl
),1,d
); printf("%s\t%s\t%.2f\n\n", cl.
tel, cl.
nom_completo, cl.
fact); fread(&cl
,sizeof(cl
),1,d
); }
}
float fact_total(FILE * d){
abonado cl;
float total=0.0;
rewind(d
);/*Pone el puntero al principio del fichero*/ fread(&cl
,sizeof(cl
),1,d
); total+=cl.fact;
fread(&cl
,sizeof(cl
),1,d
); }
return(total);
}
float fact_uno(FILE * d){
char tel[10];
abonado cl;
int comp;
float total;
printf("Telefono del abonado a facturar: "); rewind(d
);/*Pone el puntero al principio del fichero*/ fread(&cl
,sizeof(cl
),1,d
); while((comp
!= 0) && (!feof(d
))){ fread(&cl
,sizeof(cl
),1,d
); }
if(comp == 0)
total=cl.fact;
else{
printf("Abonado no encontrado\n"); total = -1;
}
return(total);
}
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.