Mezcla con fichero de accesso directo Carolina y Lydia (2004-05-06)

Función en C que mezcle dos ficheros binarios f1 y f2 en otro fichero f3.

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
char nombre[20];
int nota;
}t_reg;

t_reg leer_reg (FILE *f,int pos);
void escribir_reg (FILE *f,t_reg reg,int pos);
void MezclaFicheros (FILE *f1, FILE *f2, FILE *f3);
void main (void)
{

char nomficher1[20],nomficher2[20];
FILE *f1,*f2,*f3;
// Borrar pantalla: clrscr();
printf("Introduzca el nombre del fichero que desea mezclar:\n");
gets(nomficher1);
printf ("Introduzca el nombre del segundo fichero que desea mezclar:\n");
gets(nomficher2);
f1=fopen (nomficher1,"rb");
if (f1==NULL)
        {
        printf ("Error en la apertura del fichero 1\n");
        exit (1);
        }
f2=fopen (nomficher2,"rb");
if (f2==NULL)
        {
        printf ("Error en la apertura del fichero 2\n");
        exit (1);
        }
f3=fopen ("mezcla2.txt","wb");
if (f3==NULL)
        {
        printf ("Error en la apertura del fichero \n");
        exit (1);
        }
MezclaFicheros(f1,f2,f3);
getchar();
}
t_reg leer_reg (FILE *f,int pos)
{
t_reg reg;
fseek(f,(pos-1)*sizeof(t_reg),SEEK_SET);
fread(&reg,sizeof(t_reg),1,f);
if (ferror(f))
        {
        printf ("Error en la lectura");
        exit (2);
        }
return(reg);
}

void escribir_reg (FILE *f,t_reg reg,int pos)
{
fseek(f,(pos-1)*sizeof(t_reg),SEEK_SET);
fwrite(&reg,sizeof(t_reg),1,f);
if (ferror(f))
        {
        printf ("Error al escribir el fichero");
        exit(2);
        }
}

void MezclaFicheros (FILE *f1, FILE *f2, FILE *f3)
{
int n,m,i,j,k;
t_reg reg1,reg2;
fseek(f1,0,SEEK_END);
n=ftell(f1)/sizeof(t_reg);
fseek(f2,0,SEEK_END);
m=ftell(f2)/sizeof(t_reg);
i=1;
j=1;
k=1;
while (i<=n && j<=m)
        {
        reg1=leer_reg(f1,i);
        reg2=leer_reg(f2,j);
        if (strcmp(reg1.nombre,reg2.nombre)>0)
                {
                escribir_reg(f3,reg2,k);
                j++;
                }
        else
                {
                escribir_reg(f3,reg1,k);
                i++;
                }
        k++;
        }
while (i<=n)
        {
        escribir_reg(f3,reg1,k);
        i++;
        k++;
        }
while (j<=m)
        {
        escribir_reg(f3,reg2,k);
        j++;
        k++;
        }
}

Regresar a ejemplos