PROBLEMA CON FICHEROS!! ayuda por favor
tengo q acer un programa con dos ficheros uno de indices y otro con la informacion de los clientes.tengo q considerar altas,bajas y modificaciones.El caso es q en las altas tengo q acceder automaticamente mediante el codigo postal del cliente a otro fichero en el q esta su codigo postal su telefono y su provincia.Mi problema es q cdo inserto los campos mediante un editor q m e creado yo me copia unos campos en otros y estoy loco ya de intentarlo asi q si m pudierais exar una mano os lo agradeceria os envio el programa principal el editor,el fichero de provincias no lo puedo enviar xq ya esta creado si lo necesitais mandarme un mail
/*programa*/
#include<stdio.h>
#include<editor.h>
#include <dos.h>
#include <dir.h>
#define FICHI "h:/indice.dat"
#define FICHM "h:/maestro.dat"
typedef struct
{
char nb[15];
char ap[30];
char cp[5];
char lcl[30];
char tlf[6];
char pr[15];
}maestro;
typedef struct
{
char cod[5];
int pos;
}indice;
typedef struct
{
int cd;
char pr[15];
char prf[4];
}provin;
void main()
{
FILE *fi,*fm,*fp;
maestro regm;
indice regi;
provin regp;
struct ffblk ffblk;
int upm, ini, nreg,centro,i,sw,existe;
char cod[5],aux[5],vacio[40];
tecla tc;
clrscr();
existe=findfirst(FICHI,&ffblk,FA_ARCH);
if(!existe){
if(!(fi=fopen(FICHI,"r+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
fread(®i,sizeof(indice),1,fi);
nreg=regi.pos;}
else{
if(!(fi=fopen(FICHI,"w+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
nreg=0;}
existe=findfirst(FICHM,&ffblk,FA_ARCH);
if(!existe){
if(!(fm=fopen(FICHM,"r+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
fseek(fm,0,SEEK_END);
upm=ftell(fm)/sizeof(maestro);}
else{
if(!(fm=fopen(FICHM,"w+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
upm=0;}
fp=fopen("h:/tc3/final/provin.dat","rb");
if(!fp){
printf("ERROR AL ABRIR PROVIN.DAT");
exit(1);
}
clrscr();
strcpy(vacio,"");
fseek(fi,0,SEEK_SET);
nreg=upm;
strcpy(regi.cod,"nreg");
regi.pos=nreg;
fwrite(®i,sizeof(indice),1,fi);
printf("nIntroduce codigo (para salir no introduzca nada): ");
gets(cod);
while(strcmp(cod,""))
{
ini=1;
sw=busqueda(¢ro,&ini,®i,nreg,cod,fi); /*Hacemos la busqueda del codigo */
if(!sw)/*No encuente codigo por lo que hacemos la insercion*/
{
insertar(®i,ini,nreg,cod,upm,fi);
nreg++;
printf("nIntroduce el nombre: ");
strcpy(campo,vacio);
editor(regm.nb,15);
strcpy(regm.nb,campo);
printf("nIntroduce los apellidos: ");
strcpy(campo,vacio);
editor(regm.ap,30);
strcpy(regm.ap,campo);
printf("nIntroduce el codigo postal: ");
strcpy(campo,vacio);
editor(regm.cp,5);
strcpy(regm.cp,campo);
fseek(fp,(pro-1)*sizeof(provin),SEEK_SET);
fread(®p,sizeof(provin),1,fp);
printf("nLocalidad :");
strcpy(campo,vacio);
editor(regm.lcl,30);
strcpy(regm.lcl,campo);
printf("nProvincia :%s",regp.pr);
strcpy(campo,vacio);
strcpy(regm.pr,regp.pr);
printf("nTelefono :%s",regp.prf);
strcpy(campo,vacio);
editor(regm.tlf,6);
strcpy(regm.tlf,campo);
fseek(fm,upm*sizeof(maestro),SEEK_SET);
fwrite(®m,sizeof(maestro),1,fm);
upm++;
}
else{
printf("nEncontrado: %s,%s",regm.ap,regm.nb);
printf("nnnntttttF1------>ELIMINAR");
printf("ntttttF2------>CANCELAR)");
printf("ntttttF3------>MODIFICAR");
tc.a=bioskey(0);
if(tc.t[1]==59)
{
fseek(fm,regi.pos*sizeof(maestro),SEEK_SET);
fread(®m,sizeof(maestro),1,fm);
printf("nPulsa cualquier tecla para eliminar");
getch();
eliminar(®i,nreg,centro,fi);
nreg--;
printf("nEl codigo %s perteneciente a %s %s a sido eliminado",cod,regm.nb,regm.ap);
}
if(tc.t[1]==61)
{
fseek(fm,regi.pos*sizeof(maestro),SEEK_SET);
fread(®m,sizeof(maestro),1,fm);
printf("nNOMBRE %s",regm.nb);
printf("nApellidos %s",regm.ap);
printf("ncodigo postal %s",regm.cp);
printf("nLocalidad %s",regm.lcl);
printf("nprovincia %s",regm.pr);
printf("ntelefono %s",regm.tlf);
}
}
fseek(fi,0,SEEK_SET);
strcpy(regi.cod,"nreg");
regi.pos=nreg;
fwrite(®i,sizeof(indice),1,fi);
printf("nIntroduce un codigo(para salir no introduzca nada): ");
gets(cod);
}
fclose(fm);
fclose(fi);
}
busqueda(int *centrob,int *inib,indice *regib,int nregb,char *codb,FILE *fib)
{
int swb=0, fin;
fin=nregb;
while (!swb && *inib<=fin)
{
*centrob=(*inib+fin)/2;
fseek(fib,*centrob*sizeof(indice),SEEK_SET);
fread(regib,sizeof(indice),1,fib);
if(!(strcmp((*regib).cod,codb)))
swb=1;
else
if (strcmp(codb,(*regib).cod)>0)
*inib=(*centrob)+1;
else
fin=(*centrob)-1;
}
return(swb);
}
insertar(indice *regii,int inii,int nregi,char *codi,int upmi,FILE *fii)
{
int fin;
for(fin=nregi;fin>=inii;fin--)
{
fseek(fii,(fin)*sizeof(indice),SEEK_SET);
fread(regii,sizeof(indice),1,fii);
fseek(fii,(fin+1)*sizeof(indice),SEEK_SET);
fwrite(regii,sizeof(indice),1,fii);
}
fseek(fii,inii*sizeof(indice),SEEK_SET);
strcpy((*regii).cod,codi);
(*regii).pos=upmi;
fwrite(regii,sizeof(indice),1,fii);
}
eliminar(indice *regie,int nrege,int centroe, FILE *fie)
{
int inicio;
for(inicio=centroe;inicio<=nrege;inicio++)
{
fseek(fie,(inicio+1)*sizeof(indice),SEEK_SET);
fread(regie,sizeof(indice),1,fie);
fseek(fie,inicio*sizeof(indice),SEEK_SET);
fwrite(regie,sizeof(indice),1,fie);
}
}
/*editor*/
#include<stdio.h>
#include<bios.h>
#include<conio.h>
typedef union{
int a;
char t[2];
}tecla;
int pro;
char campo[40];
editor(char *ta,int tam)
{
tecla tc;
int lon; /*longitud de la tabla*/
int fila,columna; /*controla la posicion del cursor*/
int ind=0,p,k=0;
int inser;/*controla el modo de insercion*/
char aux[2];
strcpy(aux,"");
for(k=0;k<30;k++)
*(ta+k)=' ';
k=0;
while(campo[k]!=' ')
{
ind++;
k++;}
strcpy(ta,campo);
lon=strlen(ta);
ind=lon;
fila=wherey();
columna=wherex();
columna=columna-ind;
do{
tc.a=bioskey(0);
if(tc.t[0] && tc.t[0]!=8 && tc.t[0]!=82)
{
if(inser==1 && lon<tam){/*caso insertar*/
p=ind;
*(ta+lon)=' ';
gotoxy(columna+lon,fila);
for(k=lon-1;k>=p;k--)
*(ta+k+1)=*(ta+k);/*movemos los caracteres un espacio mas adelante a partir de donde nos indica el cursor*/
*(ta+ind)=tc.t[0];/*guardamos la tecla pulsada en la tabla*/
lon++;
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla*/
ind++;
inser=0;/*desactivo la opcion insercion*/
_setcursortype(_NORMALCURSOR);/*cambio el tipo del cursor*/
}
else{
if(lon<tam && tc.t[0]!=13 && tc.t[0]!=9){/*escribimos si no pulsamos ni enter ni tab*/
printf("%c",tc.t[0]);
lon++;
*(ta+ind)=tc.t[0];
ind++;
if(ind>tam)
ind--;}}
}
else{
if(tc.t[1]==75){/*caso izquierda*/
if(ind>0)
ind--;
}
if(tc.t[1]==77){/*caso derecha*/
if(ind<lon && ind<tam)
ind++;
}
if(tc.t[0]==8){ /*suprimir con backspace*/
if(ind>0){
p=ind;
ind--;
*(ta+lon)=' ';
for(k=p-1;k<lon;k++)
*(ta+k)=*(ta+k+1);/*suprimos el caracter delante del cursor*/
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla ya modificada*/
lon--;
}
}
if(tc.t[1]==83){ /*suprimir con supr*/
if(ind>=0){
p=ind;
ind--;
for(k=p;k<lon;k++)
*(ta+k)=*(ta+k+1);/*suprimimos el caracter indicado por el cursor*/
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla modificada*/
if(ind<0)
ind++;
lon--;
}
}
if(tc.t[1]==82){/*caso insertar*/
inser=1;
_setcursortype(_SOLIDCURSOR);}/*activamos la opcion de insertar para que al introducir el
caracter tenga en cuenta que tiene que mover la tabla*/
if(tc.t[1]==71){/*caso inicio*/
gotoxy(columna,fila);
ind=0;}
if(tc.t[1]==79){/*caso fin*/
gotoxy(columna+lon,fila);
ind=lon;}
}
strcpy(campo,ta);
gotoxy(columna+ind,fila);
}while(tc.t[0]!=13 && tc.t[0]!=9);
if(tam==5){
for(k=0;k<2;k++)
aux[k]=campo[k];
pro=atoi(aux);}
return tc.t[0];
}
un saludo,gracias
/*programa*/
#include<stdio.h>
#include<editor.h>
#include <dos.h>
#include <dir.h>
#define FICHI "h:/indice.dat"
#define FICHM "h:/maestro.dat"
typedef struct
{
char nb[15];
char ap[30];
char cp[5];
char lcl[30];
char tlf[6];
char pr[15];
}maestro;
typedef struct
{
char cod[5];
int pos;
}indice;
typedef struct
{
int cd;
char pr[15];
char prf[4];
}provin;
void main()
{
FILE *fi,*fm,*fp;
maestro regm;
indice regi;
provin regp;
struct ffblk ffblk;
int upm, ini, nreg,centro,i,sw,existe;
char cod[5],aux[5],vacio[40];
tecla tc;
clrscr();
existe=findfirst(FICHI,&ffblk,FA_ARCH);
if(!existe){
if(!(fi=fopen(FICHI,"r+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
fread(®i,sizeof(indice),1,fi);
nreg=regi.pos;}
else{
if(!(fi=fopen(FICHI,"w+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
nreg=0;}
existe=findfirst(FICHM,&ffblk,FA_ARCH);
if(!existe){
if(!(fm=fopen(FICHM,"r+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
fseek(fm,0,SEEK_END);
upm=ftell(fm)/sizeof(maestro);}
else{
if(!(fm=fopen(FICHM,"w+b"))){
printf("nNo se puede abrir el fichero");
exit(1);}
upm=0;}
fp=fopen("h:/tc3/final/provin.dat","rb");
if(!fp){
printf("ERROR AL ABRIR PROVIN.DAT");
exit(1);
}
clrscr();
strcpy(vacio,"");
fseek(fi,0,SEEK_SET);
nreg=upm;
strcpy(regi.cod,"nreg");
regi.pos=nreg;
fwrite(®i,sizeof(indice),1,fi);
printf("nIntroduce codigo (para salir no introduzca nada): ");
gets(cod);
while(strcmp(cod,""))
{
ini=1;
sw=busqueda(¢ro,&ini,®i,nreg,cod,fi); /*Hacemos la busqueda del codigo */
if(!sw)/*No encuente codigo por lo que hacemos la insercion*/
{
insertar(®i,ini,nreg,cod,upm,fi);
nreg++;
printf("nIntroduce el nombre: ");
strcpy(campo,vacio);
editor(regm.nb,15);
strcpy(regm.nb,campo);
printf("nIntroduce los apellidos: ");
strcpy(campo,vacio);
editor(regm.ap,30);
strcpy(regm.ap,campo);
printf("nIntroduce el codigo postal: ");
strcpy(campo,vacio);
editor(regm.cp,5);
strcpy(regm.cp,campo);
fseek(fp,(pro-1)*sizeof(provin),SEEK_SET);
fread(®p,sizeof(provin),1,fp);
printf("nLocalidad :");
strcpy(campo,vacio);
editor(regm.lcl,30);
strcpy(regm.lcl,campo);
printf("nProvincia :%s",regp.pr);
strcpy(campo,vacio);
strcpy(regm.pr,regp.pr);
printf("nTelefono :%s",regp.prf);
strcpy(campo,vacio);
editor(regm.tlf,6);
strcpy(regm.tlf,campo);
fseek(fm,upm*sizeof(maestro),SEEK_SET);
fwrite(®m,sizeof(maestro),1,fm);
upm++;
}
else{
printf("nEncontrado: %s,%s",regm.ap,regm.nb);
printf("nnnntttttF1------>ELIMINAR");
printf("ntttttF2------>CANCELAR)");
printf("ntttttF3------>MODIFICAR");
tc.a=bioskey(0);
if(tc.t[1]==59)
{
fseek(fm,regi.pos*sizeof(maestro),SEEK_SET);
fread(®m,sizeof(maestro),1,fm);
printf("nPulsa cualquier tecla para eliminar");
getch();
eliminar(®i,nreg,centro,fi);
nreg--;
printf("nEl codigo %s perteneciente a %s %s a sido eliminado",cod,regm.nb,regm.ap);
}
if(tc.t[1]==61)
{
fseek(fm,regi.pos*sizeof(maestro),SEEK_SET);
fread(®m,sizeof(maestro),1,fm);
printf("nNOMBRE %s",regm.nb);
printf("nApellidos %s",regm.ap);
printf("ncodigo postal %s",regm.cp);
printf("nLocalidad %s",regm.lcl);
printf("nprovincia %s",regm.pr);
printf("ntelefono %s",regm.tlf);
}
}
fseek(fi,0,SEEK_SET);
strcpy(regi.cod,"nreg");
regi.pos=nreg;
fwrite(®i,sizeof(indice),1,fi);
printf("nIntroduce un codigo(para salir no introduzca nada): ");
gets(cod);
}
fclose(fm);
fclose(fi);
}
busqueda(int *centrob,int *inib,indice *regib,int nregb,char *codb,FILE *fib)
{
int swb=0, fin;
fin=nregb;
while (!swb && *inib<=fin)
{
*centrob=(*inib+fin)/2;
fseek(fib,*centrob*sizeof(indice),SEEK_SET);
fread(regib,sizeof(indice),1,fib);
if(!(strcmp((*regib).cod,codb)))
swb=1;
else
if (strcmp(codb,(*regib).cod)>0)
*inib=(*centrob)+1;
else
fin=(*centrob)-1;
}
return(swb);
}
insertar(indice *regii,int inii,int nregi,char *codi,int upmi,FILE *fii)
{
int fin;
for(fin=nregi;fin>=inii;fin--)
{
fseek(fii,(fin)*sizeof(indice),SEEK_SET);
fread(regii,sizeof(indice),1,fii);
fseek(fii,(fin+1)*sizeof(indice),SEEK_SET);
fwrite(regii,sizeof(indice),1,fii);
}
fseek(fii,inii*sizeof(indice),SEEK_SET);
strcpy((*regii).cod,codi);
(*regii).pos=upmi;
fwrite(regii,sizeof(indice),1,fii);
}
eliminar(indice *regie,int nrege,int centroe, FILE *fie)
{
int inicio;
for(inicio=centroe;inicio<=nrege;inicio++)
{
fseek(fie,(inicio+1)*sizeof(indice),SEEK_SET);
fread(regie,sizeof(indice),1,fie);
fseek(fie,inicio*sizeof(indice),SEEK_SET);
fwrite(regie,sizeof(indice),1,fie);
}
}
/*editor*/
#include<stdio.h>
#include<bios.h>
#include<conio.h>
typedef union{
int a;
char t[2];
}tecla;
int pro;
char campo[40];
editor(char *ta,int tam)
{
tecla tc;
int lon; /*longitud de la tabla*/
int fila,columna; /*controla la posicion del cursor*/
int ind=0,p,k=0;
int inser;/*controla el modo de insercion*/
char aux[2];
strcpy(aux,"");
for(k=0;k<30;k++)
*(ta+k)=' ';
k=0;
while(campo[k]!=' ')
{
ind++;
k++;}
strcpy(ta,campo);
lon=strlen(ta);
ind=lon;
fila=wherey();
columna=wherex();
columna=columna-ind;
do{
tc.a=bioskey(0);
if(tc.t[0] && tc.t[0]!=8 && tc.t[0]!=82)
{
if(inser==1 && lon<tam){/*caso insertar*/
p=ind;
*(ta+lon)=' ';
gotoxy(columna+lon,fila);
for(k=lon-1;k>=p;k--)
*(ta+k+1)=*(ta+k);/*movemos los caracteres un espacio mas adelante a partir de donde nos indica el cursor*/
*(ta+ind)=tc.t[0];/*guardamos la tecla pulsada en la tabla*/
lon++;
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla*/
ind++;
inser=0;/*desactivo la opcion insercion*/
_setcursortype(_NORMALCURSOR);/*cambio el tipo del cursor*/
}
else{
if(lon<tam && tc.t[0]!=13 && tc.t[0]!=9){/*escribimos si no pulsamos ni enter ni tab*/
printf("%c",tc.t[0]);
lon++;
*(ta+ind)=tc.t[0];
ind++;
if(ind>tam)
ind--;}}
}
else{
if(tc.t[1]==75){/*caso izquierda*/
if(ind>0)
ind--;
}
if(tc.t[1]==77){/*caso derecha*/
if(ind<lon && ind<tam)
ind++;
}
if(tc.t[0]==8){ /*suprimir con backspace*/
if(ind>0){
p=ind;
ind--;
*(ta+lon)=' ';
for(k=p-1;k<lon;k++)
*(ta+k)=*(ta+k+1);/*suprimos el caracter delante del cursor*/
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla ya modificada*/
lon--;
}
}
if(tc.t[1]==83){ /*suprimir con supr*/
if(ind>=0){
p=ind;
ind--;
for(k=p;k<lon;k++)
*(ta+k)=*(ta+k+1);/*suprimimos el caracter indicado por el cursor*/
for(k=0;k<lon;k++)
printf("%c",32);
gotoxy(columna,fila);
for(k=0;k<lon;k++)
printf("%c",*(ta+k));/*escribimos la tabla modificada*/
if(ind<0)
ind++;
lon--;
}
}
if(tc.t[1]==82){/*caso insertar*/
inser=1;
_setcursortype(_SOLIDCURSOR);}/*activamos la opcion de insertar para que al introducir el
caracter tenga en cuenta que tiene que mover la tabla*/
if(tc.t[1]==71){/*caso inicio*/
gotoxy(columna,fila);
ind=0;}
if(tc.t[1]==79){/*caso fin*/
gotoxy(columna+lon,fila);
ind=lon;}
}
strcpy(campo,ta);
gotoxy(columna+ind,fila);
}while(tc.t[0]!=13 && tc.t[0]!=9);
if(tam==5){
for(k=0;k<2;k++)
aux[k]=campo[k];
pro=atoi(aux);}
return tc.t[0];
}
un saludo,gracias