Foros del Web » Programación para mayores de 30 ;) » C/C++ »

fallo al compilar

Estas en el tema de fallo al compilar en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/05/2010, 05:42
 
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.
  #2 (permalink)  
Antiguo 01/05/2010, 07:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: fallo al compilar

Para empezar si compilas asi: gcc ejer_fichero_6.c -o ejer_fichero_6

Tu archivo ejecutable se llama ejer_fichero_6, osea que tenes que ejecutar asi: ./ejer_fichero_6
Prueba con eso para descartar que el fichero ./a.out no sea una version vieja con algun error que te alla quedado.

Sino me pongo a ver que error puedes llegar a tener!!
  #3 (permalink)  
Antiguo 01/05/2010, 11:23
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: fallo al compilar

He compilado como me has dicho gcc ./ejer_fichero_6 y me sale esto:

./ejer_fichero_6: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: multiple definition of `_start'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:65: first defined here
./ejer_fichero_6:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.rodata+0x0): first defined here
./ejer_fichero_6: In function `_fini':
/build/buildd/glibc-2.9/csu/../sysdeps/generic/initfini.c:109: multiple definition of `_fini'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/csu/../sysdeps/generic/initfini.c:109: first defined here
./ejer_fichero_6:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): first defined here
./ejer_fichero_6: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o:(.data+0x0): first defined here
./ejer_fichero_6: In function `__data_start':
(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/i486-linux-gnu/4.3.3/crtbegin.o:(.data+0x0): first defined here
./ejer_fichero_6: In function `_init':
/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S:15: multiple definition of `_init'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S:15: first defined here
/usr/lib/gcc/i486-linux-gnu/4.3.3/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
./ejer_fichero_6:(.dtors+0x4): first defined here
collect2: ld devolvió el estado de salida 1
¿Qué significa todo esto?
  #4 (permalink)  
Antiguo 01/05/2010, 12:26
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: fallo al compilar

No dije que compiles de esa forma. Dije que lo ejecutes.
Primeros hace:

gcc ejer_fichero_6.c -o ejer_fichero_6
./ejer_fichero_6


La opcion "-o" en el Gcc sierve para darle nombre al archivo de salida, que es el ejecutable.
  #5 (permalink)  
Antiguo 01/05/2010, 13:02
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: fallo al compilar

Me da el siguiente error: Error al abrir el fichero de clientes
Fallo de segmentación
  #6 (permalink)  
Antiguo 02/05/2010, 05:00
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: fallo al compilar

Al parecer tienes que invocar a tu programa con el nombre de archivo que quieres crear y no lo estas haciendo.
Falla al crear un archivo cuyo nombre no has dado y luego tu programa esta mal construido, pues intenta cerrar un archivo que nunca abrió.
  #7 (permalink)  
Antiguo 03/05/2010, 03:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: fallo al compilar

¿Dónde debo poner el nombre del archivo? ¿te refieres al segundo programa?, respecto a lo de cerrar el archivo que no se puede porque no se abre, ¿dónde tengo el fallo?.
  #8 (permalink)  
Antiguo 03/05/2010, 09:03
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: fallo al compilar

En resumen es algo asi:

Código C++:
Ver original
  1. fp = fopen(...)
  2. if( fp != NULL ) {
  3.   // usar archivo
  4. }
  5. fclose(fp);
vs

Código C++:
Ver original
  1. fp = fopen(...)
  2. if( fp != NULL ) {
  3.   // usar archivo
  4.  fclose(fp);
  5. }
  #9 (permalink)  
Antiguo 04/05/2010, 03:35
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: fallo al compilar

¿Puedes decirme exactamente donde está el fallo y la corrección que debo hacer?
A la hora de compilarlo le tengo que pasar como parámetro los 3 nombres de fichero, pero no he puesto ningún nombre a los archivos, ¿cómo lo soluciono?. Gracias.

Etiquetas: compilar, fallo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:15.