Hola, el enunciado me dice que dos bancos tienen un fichero con la información de sus clientes, pero ahora necesitan fusionarlos en uno solo y que la información contenida esté ordenada según el DNI (de menor a mayor).
El primer programa es para introducir los datos de los clientes el fichero se llama "ejer_fichero_6_datos.c
Código C:
Ver original#include <stdio.h>
struct cliente{
char apell[100];
char nom[50];
long int dni;
char dir[100];
float saldo;
};
int main(int argc, char *argv[]){
FILE *pf;
struct cliente c1;
char op;
if((pf
=fopen(argv
[1],"wb")) == NULL
) printf("Error al abrir el fichero de clientes\n"); else{ /* Si el fichero se abre correctamente */
do{
while((op==' ') || (op=='\n') || (op=='\t'))
}while((op=='s') || (op=='S'));
}
printf("Error al cerrar el fichero\n"); } /* main() */
El segundo programa que llamo "ejer_fichero_6.c" ordena el primer fichero de clientes y hace lo mismo con el segundo.
Código C:
Ver original/* Programa del ejercicio 6 del boletin� de ficheros.
El programa toma tres cadenas de la linea de comandos
que corresponden a los nombres de dos ficheros con
la informacion de los clientes del banco y el tercero
sera el fichero ordenado con los clientes de los dos
bancos */
#include <stdlib.h>
#include <stdio.h>
struct cliente{
char apell[100];
char nom[50];
long int dni;
char dir[100];
float saldo;
};
int main(int argc, char *argv[]){
void ordena_fich_clientes();
void mezcla_fich_ordenados();
void muestra_fich_clientes();
ordena_fich_clientes(argv[1]); /* Ordena el primer fichero */
ordena_fich_clientes(argv[2]); /* Ordena el segundo fichero */
mezcla_fich_ordenados(argv[1],argv[2],argv[3]);
muestra_fich_clientes(argv[1]);
muestra_fich_clientes(argv[2]);
muestra_fich_clientes(argv[3]);
} /* main */
void ordena_fich_clientes(const char *nom_fich){
/* Ordena el fichero segun el campoo dni */
/* Ordena accediendo de forma directa al fichero */
FILE *pf;
struct cliente c1, c2; /* Variable que lee del fichero
y mira si estan en orden */
int fin=0; /* Indica el final del proceso de ordenacion */
long int pos; /* Posicion del puntero en el fichero para
guardar la posicion en el fichero del priemero
de los dos elementos que estoy comparando */
if((pf
=fopen(nom_fich
,"rb+")) == NULL
) printf("Error al abrir el fichero de clientes\n"); else{ /* Si el fichero se abre correctamente */
fread(&c1
,sizeof(c1
),1, pf
); fread(&c2
,sizeof(c2
),1, pf
); do{ /* Bucle de ordenacion */
if(c1.dni > c2.dni){ /* Los intercambia */
fseek(pf
, -(2*sizeof(c1
)), SEEK_CUR
);
/* Regresa hacia atras dos registros
para escribir c1 y c2 ordenadamente */
/* El elemento siguiente para seguir comparando */
fread(&c2
,sizeof(c2
),1, pf
); fin=1; /* Al modificar el fichero, realizamos otra
pasada al fichero */
}
else{
c1=c2;
fread(&c2
,sizeof(c2
),1, pf
); }
if(feof(pf
)){ /*Mira si se debe modificar los dos ultimos registros del fichero */
if(c1.dni > c2.dni){ /* Los intercambia */
fseek(pf
,-(2*sizeof(c1
)) , SEEK_CUR
); /* Regresa hacia atras dos registros
para escribir c1 y c2 ordenadamente */
fin=0; /* Para ver si en esta nueva iteracion hay cambios */
fread(&c1
,sizeof(c1
),1, pf
); fread(&c2
,sizeof(c2
),1, pf
); }
}
if(feof(pf
) && (fin
==1)){ /* Si en esta iteracion de la ordenacion
se ha realizado algun cambio de elementos
ponemos el puntero del fichero al principio
para seguir ordenando */
fin=0; /* Para ver si en esta nueva iteracion hay cambios */
fread(&c1
,sizeof(c1
),1, pf
); fread(&c2
,sizeof(c2
),1, pf
); }
} while(!feof(pf
)); /* Termina se estamos al final */ }
printf("Error al cerrar el fichero"); } /* ordena_fich_clientes() */
void muestra_fich_clientes(const char* nom_fich){
FILE *pf;
struct cliente c1;
if((pf
=fopen(nom_fich
,"rb")) == NULL
) printf("Error al abrir el fichero de clientes\n"); else{ /* Si el fichero se abre correctamente */
fread(&c1
,sizeof(c1
),1, pf
); printf("%s %ld\n",c1.
apell,c1.
dni); fread(&c1
,sizeof(c1
),1, pf
); }
printf("Error al cerrar el fichero"); }
} /* muestra_fich_clientes() */
void mezcla_fich_ordenados(const char *n1, const char *n2, const char *n3){
FILE *pf1, *pf2, *pf3;
struct cliente c1, c2; /* Lee de cada fichero */
if((pf1
=fopen(n1
,"rb")) == NULL
) printf("Error al abrir el fichero de clientes 1\n"); else /* Si el fichero se abre correctamente */
if((pf2
=fopen(n2
,"rb")) == NULL
) printf("Error al abrir el fichero de clientes 2\n"); else /* Si el fichero se abre correctamente */
if((pf3
=fopen(n3
,"wb")) == NULL
) /*Crea el fichero para todos los clientes */ printf("Error al crear el fichero con todos los clientes\n"); else{ /* Si el fichero se crea correctamente */
fread(&c1
,sizeof(c1
),1, pf1
); fread(&c2
,sizeof(c2
),1, pf2
); if(c1.dni < c2.dni){
fread(&c1
,sizeof(c1
),1, pf1
); }
else{
fread(&c2
,sizeof(c2
),1, pf2
); }
}
fread(&c1
,sizeof(c1
),1, pf1
); }
fread(&c2
,sizeof(c2
),1, pf2
); }
} /* else de crea pf3 */
fcloseall();
} /* mezcla_fich_ordenados() */
Cuando compilo el primer programa con gcc me sale: Error al abrir el fichero de clientes
Fallo de segmentación
Cuando compilo el siguiente programa hago gcc ejer_fichero_6.c -o ejer_fichero_6
y a continuación pongo ./a.out y me sale: Error al abrir el fichero de clientes
Fallo de segmentación
Cómo puedo compilar el primer programa y el segundo correctamente?. Gracias.