Este es el mismo ejercicio, pero usando la función fseek:
Código C:
Ver original#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LEE_CAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();
#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]=getchar(); }\
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","rb+")) == NULL
){ fprintf(stderr
,"Error al abrir el fichero de ejer_fichero3_sec\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\nElija 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;} } /* switch */
} while((op != 's') && (op != 'S'));
if(pf != NULL)
fprintf(stderr
,"Error al cerrar el fichero de ejer_fichero3_sec\n"); } /* main() */
void alta_fact(FILE * d){
abonado cliente;
/* Antes del alta hemos de ir al final del fichero por si
con el acceso directo el puntero esta en otra posicion */
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
); } /* alta_fact() */
void modif_fich( FILE * d){
char op;
char tel[10];
abonado cl;
int comp;
printf("Telefono del abonado a buscar/modificar: "); 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){
printf("Abonado encontrado:\n"); printf("%s\n%s\n%f\n",cl.
nom_completo,cl.
tel,cl.
fact); printf("Modificar factura (s/n)? "); LEE_CAR(op);
if((op =='s') || (op == 'S')){
printf("Valor de la factura: "); /* Debemos RETROCEDER en el fichero
los bytes que tenga un registro
desde esta posicion; estamos en
el primer byte del registro siguiente */
fseek(d
,-(sizeof(cl
)),SEEK_CUR
); }
else{ printf("Abonado no encontrado\n"); } }
} /* modif_fich() */
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
); }
} /* mostrar_todo() */
float fact_total(FILE * d){
abonado cl;
float total=0.0;
fread(&cl
,sizeof(cl
),1,d
); total+=cl.fact;
fread(&cl
,sizeof(cl
),1,d
); }
return(total);
} /* fact_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);
} /* fact_uno() */
Cuando lo compilo me dice lo siguiente: Error al abrir el fichero de ejer_fichero3_sec