Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: javahat en 29 Abril 2010, 22:24 pm



Título: problema con archivo
Publicado por: javahat en 29 Abril 2010, 22:24 pm
Hola necesito trabajar con archivos pero tengo un problema al cargar los datos del archivo a un arreglo como lo puedo hacer? aquí dejo mi avance.

Código
  1. ;
  2.    int edad;
  3. };
  4.  
  5.  
  6.  
  7. void ingresardatos(struct registro personas[]){
  8.  int i=0;
  9.  
  10.  for(i=0;i<3;i++){
  11.  
  12.  printf("Nombre:");
  13.  scanf("%s", &personas[i].nombre);
  14.  printf("Edad:");
  15.  scanf("%d", &personas[i].edad);
  16.  
  17.  }
  18.  
  19.  
  20. }
  21.  
  22.  
  23. void guardarfichero(struct registro personas[]){
  24.  
  25.   int i;
  26.    FILE *archivo;
  27.  
  28.    archivo=fopen("fichero.txt","w");
  29.  
  30.    for(i=0;i<3;i++){
  31.       fprintf(archivo, "%s\n" ,personas[i].nombre);
  32.       fprintf(archivo, "%d\n" ,personas[i].edad);
  33.  
  34.      }
  35.  
  36. fclose(archivo);
  37. }
  38.  
  39. void cargarfichero(struct registro personas[]){
  40. FILE *archivo;
  41. int i;
  42. archivo=fopen("fichero.txt","a");
  43.  if(archivo==NULL){
  44.      printf("No se ha podido abrir el archivo");
  45.  }
  46.  
  47.  i=0;
  48.  while(!feof(archivo)){
  49.  
  50.  
  51.      fscanf(archivo, "%d", &personas[i].edad);
  52.  
  53.     printf("%s",personas[i].nombre);
  54.     printf("%d",personas[i].edad);
  55.  
  56.   i++;
  57.  
  58.  
  59.  }
  60.  
  61.  
  62.  fclose(archivo);
  63.  
  64. }
  65.  
  66.  
  67.  
  68.  
  69. main(){
  70.  
  71. struct registro personas[3];
  72.  
  73.  
  74.  ingresardatos(personas);
  75.  guardarfichero(personas);
  76.  cargarfichero(personas);
  77.  
  78. }


Título: Re: problema con archivo
Publicado por: leogtz en 30 Abril 2010, 00:35 am
Suponiendo que el contenido del archivo es algo así:

Código:
Michael Jackson
0
Lola Beltran
12
Leo Gutierrez R.
19

Prueba esto:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct fecha
  5. {
  6.    char nombre[100];
  7.    unsigned int edad;
  8. } personas[3];
  9. void cargarArchivo(struct fecha personas[])
  10. {
  11.    FILE *archivo = fopen("file.txt", "r");
  12.    unsigned int i = 0;
  13.    if(archivo == NULL)
  14.    {
  15.        fprintf(stderr, "Error abriendo el archivo.");
  16.        exit(1);
  17.    }
  18.    char linea[100];
  19.    while(!feof(archivo))
  20.    {
  21.        fgets(linea, 100, archivo);
  22.        strcpy(personas[i].nombre, linea);
  23.        fgets(linea, 100, archivo);
  24.        personas[i].edad = atoi(linea);
  25.        i++;
  26.    }
  27.    fclose(archivo);
  28. }
  29. int main(void)
  30. {
  31.    cargarArchivo(personas);
  32.    unsigned int i;
  33.    for(i = 0; i < 3; i++)
  34.        printf("Nombre : %sEdad : %u\n", personas[i].nombre, personas[i].edad);
  35.    return EXIT_SUCCESS;
  36. }
  37.  


Título: Re: problema con archivo
Publicado por: Littlehorse en 30 Abril 2010, 01:04 am
No deberías usar feof de esa forma. Es posible que si el archivo esta mal formateado en la segunda lectura alcances el final del archivo sin saberlo, por lo tanto quedaría contenido basura en la estructura.

Código
  1. while (fgets(linea, 100, archivo))
  2. {
  3.   //hago lo que sea con el buffer
  4.     if(fgets(linea, 100, archivo))
  5.          //hago de nuevo lo que sea con el buffer
  6. }
  7.  

O cualquier variación que se te ocurra entre eso y feof para no alcanzar el final del archivo sin que el programa se de cuenta.

Saludos!


Título: Re: problema con archivo
Publicado por: leogtz en 30 Abril 2010, 01:08 am
Gracias por el comentario.

Sólo habría que cambiar por esto:

Código
  1. while(fgets(linea, 100, archivo))
  2.    {
  3.        strcpy(personas[i].nombre, linea);
  4.        if(fgets(linea, 100, archivo))
  5.        personas[i].edad = atoi(linea);
  6.        i++;
  7.    }


Título: Re: problema con archivo
Publicado por: javahat en 2 Mayo 2010, 04:47 am
Gracias por los distintos consejos, he logrado abrir leer el archivo y pasarlo a una matriz pero cuando realizo el fscanf me toma en la ultima linea del archivo un registro basura con caracteres raros.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct registro{
  5.  
  6.    char nombre[10];
  7.    char clave[10];
  8.    char repetirclave[10];
  9.    int edad;
  10. };
  11.  
  12.  
  13.  
  14. void ingresardatos(struct registro personas[]){
  15.  int i=0;
  16.  
  17. FILE *archivo;
  18.  
  19. archivo=fopen("fichero.txt","a+");
  20.  
  21.  
  22.  for(i=0;i<3;i++){
  23.  
  24.  printf("Nombre:");
  25.  
  26.  scanf("%s",&personas[i].nombre);
  27.  
  28.  
  29.  }
  30. fclose(archivo);
  31. }
  32.  
  33. void guardarfichero(struct registro personas[]){
  34.  
  35.   int i;
  36.    FILE *archivo;
  37.  
  38.    archivo=fopen("fichero.txt","a+");
  39.  
  40.    for(i=0;i<3;i++){
  41.       fprintf(archivo, "%s\n" ,personas[i].nombre);
  42.  
  43.   }
  44.  
  45. fclose(archivo);
  46. }
  47.  
  48. void cargarfichero(struct registro personas[]){
  49.  
  50. FILE *archivo;
  51. int i;
  52.  
  53. archivo=fopen("fichero.txt","r");
  54.  if(archivo==NULL){
  55.      printf("No se ha podido abrir el archivo");
  56.  }
  57.  i=0;
  58.  
  59.  
  60.  while(!feof(archivo)){
  61.  
  62.  fscanf(archivo, "%s", &personas[i].nombre);
  63.  
  64.  printf("Numero %d :%s\n",i,personas[i].nombre);
  65.  i++;
  66.  
  67.  
  68.  }
  69.  
  70. fclose(archivo);
  71. }
  72.  
  73. main(){
  74.  
  75. struct registro personas[50];
  76.  
  77.  
  78. ingresardatos(personas);
  79. guardarfichero(personas);
  80.  cargarfichero(personas);
  81.  
  82.  


Título: Re: problema con archivo
Publicado por: Dellarts en 2 Mayo 2010, 16:08 pm
No he sabido encontrar el error pero cuando trabajes con estructuras si utilizas el fread te sera mas facil y no te dara el problema que te esta dando