| Ejemplos de C - Partición, mezcla y ordenación de ficheros secuenciales |
1.- Programa que divide los datos de un fichero en otros 2 según el tipo de cuenta que tenga el cliente:
#include<stdio.h>
#include<string.h>
FILE *fcuentas;
FILE *fplazo;
FILE *fotras;
struct strcuentas
{
long int nro_cuenta;
long int fecha;
int codigo;
char tipocuenta;
long int saldo;
};
void main()
{
struct strcuentas rcuentas;
fcuentas=fopen("a:\\ficheros\\fcuentas.d","wb");
if (fcuentas==NULL)
{
puts("Error de apertura en fcuentas");
goto fin;
}
puts("Teclea número de cuenta (0 para terminar)");
scanf("%ld",&rcuentas.nro_cuenta);
while(rcuentas.nro_cuenta!=0)
{
puts("Teclea fecha de apertura");
scanf("%ld",&rcuentas.fecha);
puts("Teclea codigo del titular");
scanf("%d",&rcuentas.codigo);
do
{
puts("Teclea tipo de cuenta (A,C,P)");
fflush(stdin);
rcuentas.tipocuenta=getchar();
} while(rcuentas.tipocuenta!='a' && rcuentas.tipocuenta!='A' &&
rcuentas.tipocuenta!='c' && rcuentas.tipocuenta!='C' && rcuentas.tipocuenta!='p'
&& rcuentas.tipocuenta!='P' );
puts("Teclea saldo");
scanf("%ld",&rcuentas.saldo);
fwrite((char*)&rcuentas,sizeof(rcuentas),1,fcuentas);
puts("Teclea número de cuenta (0 para terminar)");
scanf("%ld",&rcuentas.nro_cuenta);
}
fclose(fcuentas);
fcuentas=fopen("a:\\ficheros\\fcuentas.d","rb");
if(fcuentas==NULL)
{
puts("Error de apertura en fcuentas");
goto fin;
}
fplazo=fopen("a:\\ficheros\\fplazo.d","wb");
if(fplazo==NULL)
{
puts("Error de apertura en fplazo");
goto fin;
}
fotras=fopen("a:\\ficheros\\fotras.d","wb");
if(fotras==NULL)
{
puts("Error de apertura en fotras");
goto fin;
}
fread((char*)&rcuentas,sizeof(rcuentas),1,fcuentas);
while(!feof(fcuentas))
{
if(rcuentas.tipocuenta=='p' || rcuentas.tipocuenta=='P')
fwrite((char*)&rcuentas,sizeof(rcuentas),1,fplazo);
else
fwrite((char*)&rcuentas,sizeof(rcuentas),1,fotras);
fread((char*)&rcuentas,sizeof(rcuentas),1,fcuentas);
}
fclose (fcuentas);
fclose(fplazo);
fclose(fotras);
fin:puts("Fin del programa");
}
2.- Programa que lee 2 ficheros con el mismo formato junta los datos de estos 2 ficheros en otro fichero nuevo:
#include<stdio.h>
#include<string.h>
#include<limits.h>
struct strcuentas
{
long int nro_cuenta;
long int fecha;
int codigo;
char tipocuenta;
long int saldo;
};
void leer_fplazo(FILE *fplazo, struct strcuentas *rplazo);
void leer_fotras(FILE *fotras, struct strcuentas *rotras);
void main()
{
FILE *fcuentas;
FILE *fplazo;
FILE *fotras;
struct strcuentas rplazo,rotras;
if((fplazo=fopen("a:\\ficheros\\fplazo.d","rb"))==NULL)
{
puts("Error de apertura en el fichero fplazo");
goto fin;
}
if((fotras=fopen("a:\\ficheros\\fotras.d","rb"))==NULL)
{
puts("Error de apertura en el fichero fotras");
goto fin;
}
if((fcuentas=fopen("a:\\ficheros\\fcuentas.d","wb"))==NULL)
{
puts("Error de apertura en el fichero fcuentas");
goto fin;
}
leer_fplazo(fplazo,&rplazo);
leer_fotras(fotras,&rotras);
while (rplazo.codigo!=INT_MAX || rotras.codigo!=INT_MAX)
{
if (rplazo.codigo<=rotras.codigo)
{
fwrite((char*)&rplazo,sizeof(rplazo),1,fcuentas);
leer_fplazo(fplazo,&rplazo);
}
else
{
fwrite((char*)&rotras,sizeof(rotras),1,fcuentas);
leer_fotras(fotras,&rotras);
}
}
fclose(fplazo);
fclose(fotras);
fclose(fcuentas);
fin:puts("Fin del programa");
}
void leer_fplazo(FILE *fplazo, struct strcuentas *rplazo)
{
fread((char*)rplazo,sizeof(struct strcuentas),1,fplazo);
if (feof(fplazo))
rplazo->codigo=INT_MAX;
}
void leer_fotras(FILE *fotras, struct strcuentas *rotras)
{
fread((char*)rotras,sizeof(struct strcuentas),1,fotras);
if (feof(fotras))
rotras->codigo=INT_MAX;
}
3.- Programa que ordena por número de cuenta un fichero que está ordenado por código de titular:
#include<stdio.h>
struct strcuentas
{
long int nro_cuenta;
long int fecha;
int codigo;
char tipocuenta;
long int saldo;
};
void proceso_particion(int lsec);
void proceso_mezcla(int lsec);
void main()
{
FILE *fcuentas;
struct strcuentas rcuentas;
int creg;
int lsec;
if ((fcuentas=fopen("a:\\ficheros\\fcuentas.d","rb"))==NULL)
{
puts("Error de apertura en fcuentas");
goto fin;
}
creg=0;
fread((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas);
while(!feof(fcuentas))
{
creg++;
fread((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas);
}
fclose(fcuentas);
lsec=1;
while(lsec<creg)
{
proceso_particion(lsec);
proceso_mezcla(lsec);
}
fin:puts("Final del programa");
}
void proceso_particion(int lsec)
{
FILE *fcuentas;
FILE *fcuentas1;
FILE *fcuentas2;
struct strcuentas rcuentas;
int creg1,creg2;
if ((fcuentas=fopen("a:\\ficheros\\fcuentas.d","rb"))==NULL)
{
puts("Error de apertura en fcuentas");
goto fin;
}
if ((fcuentas1=fopen("a:\\ficheros\\fcuentas1.d","wb"))==NULL)
{
puts("Error de apertura en fcuentas1");
goto fin;
}
if ((fcuentas2=fopen("a:\\ficheros\\fcuentas2.d","wb"))==NULL)
{
puts("Error de apertura en fcuentas2");
goto fin;
}
fread((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas);
while (!feof(fcuentas))
{
creg1=0;
while (!feof(fcuentas) && creg1<lsec)
{
creg1++;
fwrite((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas1);
fread((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas);
}
creg2=0;
while(!feof(fcuentas) && creg2<lsec)
{
creg2++;
fwrite((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas2);
fread((char*)&rcuentas,sizeof(struct strcuentas),1,fcuentas);
}
}
fclose(fcuentas);
fclose(fcuentas1);
fclose(fcuentas2);
fin: puts("Final del proceso de particion");
}
void proceso_mezcla(int lsec)
{
FILE *fcuentas;
FILE *fcuentas1;
FILE *fcuentas2;
struct strcuentas rcuentas1,rcuentas2;
int creg1,creg2;
if ((fcuentas=fopen("a:\\ficheros\\fcuentas.d","wb"))==NULL)
{
puts("Error de apertura en fcuentas");
goto fin;
}
if ((fcuentas1=fopen("a:\\ficheros\\fcuentas1.d","rb"))==NULL)
{
puts("Error de apertura en fcuentas1");
goto fin;
}
if ((fcuentas2=fopen("a:\\ficheros\\fcuentas2.d","rb"))==NULL)
{
puts("Error de apertura en fcuentas2");
goto fin;
}
fread((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas1);
fread((char*)&rcuentas2,sizeof(struct strcuentas),1,fcuentas2);
while(!feof(fcuentas1) && !feof(fcuentas2))
{
creg1=0;
creg2=0;
while(!feof(fcuentas1) && creg1<lsec && !feof(fcuentas2)
&& creg2<lsec)
{
if (rcuentas1.nro_cuenta<=rcuentas2.nro_cuenta)
{
fwrite((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas);
creg1++;
fread((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas1);
}
else
{
fwrite((char*)&rcuentas2,sizeof(struct strcuentas),1,fcuentas);
creg1++;
fread((char*)&rcuentas2,sizeof(struct strcuentas),1,fcuentas2);
}
}
while(!feof(fcuentas1) && creg1<lsec)
{
fwrite((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas);
creg1++;
fread((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas1);
}
while(!feof(fcuentas2)&& creg2<lsec)
{
fwrite((char*)&rcuentas2,sizeof(struct strcuentas),1,fcuentas);
creg1++;
fread((char*)&rcuentas2,sizeof(struct strcuentas),1,fcuentas2);
}
}
while(!feof(fcuentas1))
{
fwrite((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas);
fread((char*)&rcuentas1,sizeof(struct strcuentas),1,fcuentas1);
}
fclose(fcuentas1);
fclose(fcuentas2);
fclose(fcuentas);
fin: puts("Final del proceso de mezcla");
}