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(®,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(®,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++; } }