elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No me lee correctamente datos de un archivo, ayuda!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No me lee correctamente datos de un archivo, ayuda!  (Leído 3,031 veces)
k3r00t

Desconectado Desconectado

Mensajes: 17



Ver Perfil
No me lee correctamente datos de un archivo, ayuda!
« 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!


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: No me lee correctamente datos de un archivo, ayuda!
« Respuesta #1 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.


« Última modificación: 5 Julio 2011, 21:42 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
k3r00t

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: No me lee correctamente datos de un archivo, ayuda!
« Respuesta #2 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?
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: No me lee correctamente datos de un archivo, ayuda!
« Respuesta #3 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.  
« Última modificación: 6 Julio 2011, 00:14 am por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: No me lee correctamente datos de un archivo, ayuda!
« Respuesta #4 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con metodos de un archivo (estructura de datos)
Programación General
crifesma 0 1,996 Último mensaje 3 Junio 2011, 03:02 am
por crifesma
Conoce las compañías de Internet que cifran tus datos correctamente
Noticias
wolfbcn 0 1,426 Último mensaje 24 Noviembre 2013, 13:01 pm
por wolfbcn
No lee bien los datos de entrada
.NET (C#, VB.NET, ASP)
Meta 1 3,129 Último mensaje 25 Febrero 2021, 12:14 pm
por Meta
Guardar datos correctamente en un archivo
Scripting
Meta 2 2,719 Último mensaje 11 Marzo 2022, 18:31 pm
por Serapis
Powershell no toma los datos correctamente.
Scripting
**Aincrad** 3 791 Último mensaje 23 Agosto 2024, 22:09 pm
por Danielㅤ
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines