Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: k3r00t en 5 Julio 2011, 18:59 pm



Título: No me lee correctamente datos de un archivo, ayuda!
Publicado por: k3r00t en 5 Julio 2011, 18:59 pm
Este es el caso, tengo un archivo de esta forma:

Código:
21
Shukra P
Io L
Aisa A
Sirio S
Mangala P
Alfa_Centauri S
Europa L
Guru P
Beta_Crucis S
Laquesis A
Ganimedes L
Cloto A
Vega S
Capella S
Atropos A
Shani P
Rigel S
Calisto L
Afrodita_Urania A
Budha P
Alfa_Crucis S

Leo el numero de cuerpos n que en este caso es 21 e inicio este ciclo para guardarlos en un vector de registro:

Código:
fscanf(pf,"%d",&n);  

for (i=1;i<=n;i++){   

fscanf(pf,"%s",planet_info[i-1].nombre);
fscanf(pf,"%c",planet_info[i-1].cod);

}

Donde planet_info es un vector de tipo cuerpos y cuerpos es un registro que contiene dos elementos, una cadena nombre y un char cod. El problema es que solo me almacena hasta Ganimedes y no me llega hasta el final. y la verdad no entiendo cual pueda ser el problema! el archivo abre y cierra perfectamente y el vector esta declarado para 200 posiciones. si me echan una mano seria de gran ayuda, saludos!


Título: Re: No me lee correctamente datos de un archivo, ayuda!
Publicado por: leogtz en 5 Julio 2011, 21:22 pm
Prueba así:

Código
  1. fscanf(pf,"%d",&n);  
  2. for (i=1;i<=n;i++)
  3. fscanf(pf,"%s %c",planet_info[i-1].nombre, planet_info[i-1].cod);
  4.  

La explicación de por qué falla es que con cafa fscanf() avanzas una línea, así que ibas avanzando de dos en dos.


Título: Re: No me lee correctamente datos de un archivo, ayuda!
Publicado por: k3r00t en 5 Julio 2011, 23:09 pm
Prueba así:

Código
  1. fscanf(pf,"%d",&n);  
  2. for (i=1;i<=n;i++)
  3. fscanf(pf,"%s %c",planet_info[i-1].nombre, planet_info[i-1].cod);
  4.  

La explicación de por qué falla es que con cafa fscanf() avanzas una línea, así que ibas avanzando de dos en dos.

Si se me había ocurrido esa idea pero me lanza lo mismo! lo que me imprime es esto:

Citar
21
Shukra P
Io L
Aisa A
Sirio S
Mangala P
Alfa_Centauri S
Europa L
Guru P
Beta_Crucis S
Laquesis A
Ganimedes

y pense en eso que me dijiste porque contando hasta la palabra Ganimedes hay exactamente 21, y puse 42 en el archivo y si me los lee completo pero necesito ese n intacto, que sera?


Título: Re: No me lee correctamente datos de un archivo, ayuda!
Publicado por: leogtz en 6 Julio 2011, 00:06 am
He probado lo siguiente y me funciona, miralo:

Código
  1. #include <stdio.h>
  2.  
  3. struct _cuerpos
  4. {
  5.    char nombre[80];
  6.    char cod;
  7. } cuerpos[21]; /* Esto puede variar así que es mejor usar un arreglo dinámico de estructuras */
  8.  
  9. int main(void)
  10. {
  11.    FILE *pf = fopen("file.txt", "r");
  12.  
  13.    int n;
  14.    char string[80], c;
  15.  
  16.    fscanf(pf, "%d", &n);
  17.    printf("%d\n", n);
  18.  
  19.    unsigned i;
  20.  
  21.    for(i = 0; i < n; i++)
  22.    {
  23.        fscanf(pf, "%80s %c", cuerpos[i].nombre, &cuerpos[i].cod);
  24.        printf("[%s][%c]\n", cuerpos[i].nombre, cuerpos[i].cod);
  25.    }
  26.  
  27.    fclose(pf);
  28.    return 0;
  29.  
  30. }
  31.  

file.txt es el mismo archivo que has puesto.


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct _cuerpos
  5. {
  6.    char nombre[80];
  7.    char cod;
  8. } *cuerpos;
  9.  
  10. int main(void)
  11. {
  12.    unsigned n, i;
  13.    FILE *fp = fopen("file.txt", "r");
  14.    if(fp == NULL)
  15.    {
  16.        perror("Error abriendo archivo");
  17.        exit(EXIT_FAILURE);
  18.    }
  19.  
  20.    fscanf(fp, "%d", &n);
  21.  
  22.    /* Crear el arreglo dinámico */
  23.    cuerpos = malloc(sizeof(struct _cuerpos) * n);
  24.    for(i = 0; i < n; i++)
  25.    {
  26.        fscanf(fp, "%s %c", cuerpos[i].nombre, &cuerpos[i].cod);
  27.        printf("[%s][%c]\n", cuerpos[i].nombre, cuerpos[i].cod);
  28.    }
  29.  
  30.    free(cuerpos);
  31.  
  32.    fclose(fp);
  33. return EXIT_SUCCESS;
  34. }
  35.  


Título: Re: No me lee correctamente datos de un archivo, ayuda!
Publicado por: rir3760 en 6 Julio 2011, 01:21 am
La recomendación dada por Leo (uso de "%s %c") debe solucionar el problema.


La causa del error es la siguiente, al utilizar estas dos llamadas:
Código
  1. fscanf(pf,"%s",planet_info[i-1].nombre);
  2. fscanf(pf,"%c",planet_info[i-1].cod);

En la primera iteracion del bucle la primera llamada lee una palabra y el problema viene con la segunda: "%c" lee el primer carácter que encuentre sin ignorar el espacio blanco (espacio, tabulador, avance de linea, etc.). Ese es el espacio que separa la palabra del carácter.

En la segunda iteracion del bucle la primera llamada a función con "%s" lee el carácter y la segunda llamada con "%c" lee el avance de linea.

Esa es la razón por la cual debes doblar el numero de registros.


Para evitarlo basta con utilizar "%s %c" ya que esta lee una palabra ("%s"), descarta el espacio (" ")y por ultimo lee el carácter ("%c").

Un saludo