Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/05/2010, 05:42
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
fallo al compilar

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
  1. #include <stdio.h>
  2.    struct cliente{
  3.       char apell[100];
  4.       char nom[50];
  5.       long int dni;
  6.       char dir[100];
  7.       float saldo;
  8.    };
  9.        
  10.    int main(int argc, char *argv[]){
  11.      FILE *pf;
  12.      struct cliente c1;
  13.      char op;
  14.      
  15.      if((pf=fopen(argv[1],"wb")) == NULL)
  16.         printf("Error al abrir el fichero de clientes\n");
  17.      else{ /* Si el fichero se abre correctamente */
  18.         do{
  19.         printf("Apellidos: ");
  20.         scanf("%99s",c1.apell);            
  21.             printf("Nombre: ");
  22.         scanf("%49s",c1.nom);
  23.         printf("DNI(numero): ");
  24.         scanf("%ld",&c1.dni);
  25.         printf("Direccion: ");
  26.         scanf("%99s",c1.dir);
  27.         printf("Saldo: ");
  28.         scanf("%f",&c1.saldo);
  29.         fwrite(&c1,sizeof(c1),1, pf);
  30.         printf("Otro(s/n)");
  31.         op=getchar();
  32.         while((op==' ') || (op=='\n') || (op=='\t'))
  33.           op=getchar();
  34.      }while((op=='s') || (op=='S'));
  35.      }    
  36.      if(fclose(pf) == EOF)
  37.        printf("Error al cerrar el fichero\n");
  38.    } /* 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
  1. /* Programa del ejercicio 6 del boletin� de ficheros.
  2.    El programa toma tres cadenas de la linea de comandos
  3.    que corresponden a los nombres de dos ficheros con
  4.    la informacion de los clientes del banco y el tercero
  5.    sera el fichero ordenado con los clientes de los dos
  6.    bancos */
  7.    #include <stdlib.h>
  8.    #include <stdio.h>
  9.    struct cliente{
  10.       char apell[100];
  11.       char nom[50];
  12.       long int dni;
  13.       char dir[100];
  14.       float saldo;
  15.    };
  16.        
  17.    int main(int argc, char *argv[]){
  18.      void ordena_fich_clientes();
  19.      void mezcla_fich_ordenados();
  20.      void muestra_fich_clientes();
  21.      
  22.      ordena_fich_clientes(argv[1]); /* Ordena el primer fichero */
  23.      ordena_fich_clientes(argv[2]); /* Ordena el segundo fichero */
  24.      mezcla_fich_ordenados(argv[1],argv[2],argv[3]);
  25.      printf("\n%s\n",argv[1]);
  26.      printf("\n");
  27.      muestra_fich_clientes(argv[1]);
  28.      printf("\n");
  29.      printf("\n%s\n",argv[2]);
  30.      printf("\n");
  31.      muestra_fich_clientes(argv[2]);
  32.      printf("\n%s\n",argv[3]);
  33.      printf("\n");
  34.      muestra_fich_clientes(argv[3]);
  35.      exit(0);
  36.    } /* main */
  37.    
  38.    void ordena_fich_clientes(const char *nom_fich){
  39.    /* Ordena el fichero segun el campoo dni */  
  40.    /* Ordena accediendo de forma directa al fichero */
  41.      FILE *pf;
  42.      struct cliente c1, c2; /* Variable que lee del fichero
  43.                                y mira si estan en orden */
  44.      int fin=0; /* Indica el final del proceso de ordenacion */
  45.      long int pos; /* Posicion del puntero en el fichero para
  46.                       guardar la posicion en el fichero del priemero
  47.               de los dos elementos que estoy comparando */
  48.      
  49.      if((pf=fopen(nom_fich,"rb+")) == NULL)
  50.         printf("Error al abrir el fichero de clientes\n");
  51.      else{ /* Si el fichero se abre correctamente */
  52.         fread(&c1,sizeof(c1),1, pf);
  53.     fread(&c2,sizeof(c2),1, pf);
  54.     do{ /* Bucle de ordenacion */
  55.         if(c1.dni > c2.dni){ /* Los intercambia */
  56.           fseek(pf, -(2*sizeof(c1)), SEEK_CUR);
  57.          
  58.           /* Regresa hacia atras dos registros
  59.              para escribir c1 y c2 ordenadamente */
  60.           fwrite(&c2,sizeof(c2),1,pf);       
  61.               fwrite(&c1,sizeof(c1),1,pf);
  62.           /* El elemento siguiente para seguir comparando */
  63.           fread(&c2,sizeof(c2),1, pf);
  64.           fin=1; /* Al modificar el fichero, realizamos otra
  65.                     pasada al fichero */
  66.         }
  67.         else{
  68.            c1=c2;
  69.            fread(&c2,sizeof(c2),1, pf);
  70.         }
  71.         if(feof(pf)){ /*Mira si se debe modificar los
  72.                         dos ultimos registros del fichero */
  73.          
  74.           if(c1.dni > c2.dni){ /* Los intercambia */
  75.         fseek(pf,-(2*sizeof(c1)) , SEEK_CUR);
  76.             /* Regresa hacia atras dos registros
  77.                para escribir c1 y c2 ordenadamente */
  78.                 fwrite(&c2,sizeof(c2),1,pf);         
  79.             fwrite(&c1,sizeof(c1),1,pf);
  80.             fseek(pf, 0, SEEK_SET);
  81.             fin=0; /* Para ver si en esta nueva iteracion hay cambios */
  82.                 fread(&c1,sizeof(c1),1, pf);
  83.             fread(&c2,sizeof(c2),1, pf);
  84.           }    
  85.         }      
  86.            
  87.         if(feof(pf) && (fin==1)){
  88.          /* Si en esta iteracion de la ordenacion
  89.             se ha realizado algun cambio de elementos
  90.         ponemos el puntero del fichero al principio
  91.         para seguir ordenando */
  92.          fseek(pf, 0, SEEK_SET);
  93.          fin=0; /* Para ver si en esta nueva iteracion hay cambios */
  94.              fread(&c1,sizeof(c1),1, pf);
  95.              fread(&c2,sizeof(c2),1, pf);
  96.         }  
  97.        
  98.     } while(!feof(pf)); /* Termina se estamos al final */
  99.      } 
  100.      if(fclose(pf) == EOF)
  101.        printf("Error al cerrar el fichero");
  102.    } /* ordena_fich_clientes() */            
  103.    
  104.    void muestra_fich_clientes(const char* nom_fich){
  105.      FILE *pf;
  106.      struct cliente c1;
  107.      if((pf=fopen(nom_fich,"rb")) == NULL)
  108.         printf("Error al abrir el fichero de clientes\n");
  109.      else{ /* Si el fichero se abre correctamente */
  110.         fread(&c1,sizeof(c1),1, pf);
  111.         while(!feof(pf)){
  112.        printf("%s %ld\n",c1.apell,c1.dni);
  113.        fread(&c1,sizeof(c1),1, pf);
  114.     }
  115.     if(fclose(pf) == EOF)
  116.        printf("Error al cerrar el fichero");
  117.      }     
  118.    } /* muestra_fich_clientes() */  
  119.    
  120.    void mezcla_fich_ordenados(const char *n1, const char *n2, const char *n3){
  121.       FILE *pf1, *pf2, *pf3;
  122.       struct cliente c1, c2; /* Lee de cada fichero */
  123.       if((pf1=fopen(n1,"rb")) == NULL)
  124.         printf("Error al abrir el fichero de clientes 1\n");
  125.       else /* Si el fichero se abre correctamente */
  126.        if((pf2=fopen(n2,"rb")) == NULL)
  127.         printf("Error al abrir el fichero de clientes 2\n");
  128.        else /* Si el fichero se abre correctamente */
  129.          if((pf3=fopen(n3,"wb")) == NULL) /*Crea el fichero para todos los clientes */
  130.            printf("Error al crear el fichero con todos los clientes\n");
  131.      else{ /* Si el fichero se crea correctamente */
  132.         fread(&c1,sizeof(c1),1, pf1);
  133.         fread(&c2,sizeof(c2),1, pf2);
  134.         while((!feof(pf1)) && (!feof(pf2))){
  135.            if(c1.dni < c2.dni){
  136.              fwrite(&c1,sizeof(c1),1,pf3);
  137.          fread(&c1,sizeof(c1),1, pf1);
  138.            }
  139.            else{
  140.              fwrite(&c2,sizeof(c2),1,pf3);
  141.          fread(&c2,sizeof(c2),1, pf2);
  142.            }
  143.         }
  144.         while(!feof(pf1)){
  145.              fwrite(&c1,sizeof(c1),1,pf3);
  146.          fread(&c1,sizeof(c1),1, pf1);
  147.         }  
  148.            
  149.         while(!feof(pf2)){
  150.              fwrite(&c2,sizeof(c2),1,pf3);
  151.          fread(&c2,sizeof(c2),1, pf2);
  152.         }
  153.      } /* else de crea pf3 */
  154.     fcloseall();
  155.     } /* 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.