Autor
|
Tema: No me lee correctamente datos de un archivo, ayuda! (Leído 3,042 veces)
|
k3r00t
Desconectado
Mensajes: 17
|
Este es el caso, tengo un archivo de esta forma: 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: 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
Mensajes: 3.069
/^$/
|
Prueba así: for (i=1;i<=n;i++) fscanf(pf ,"%s %c",planet_info [i -1]. nombre, planet_info [i -1]. cod);
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
|
|
|
|
k3r00t
Desconectado
Mensajes: 17
|
Prueba así: for (i=1;i<=n;i++) fscanf(pf ,"%s %c",planet_info [i -1]. nombre, planet_info [i -1]. cod);
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: 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
Mensajes: 3.069
/^$/
|
He probado lo siguiente y me funciona, miralo: #include <stdio.h> struct _cuerpos { char nombre[80]; char cod; } cuerpos[21]; /* Esto puede variar así que es mejor usar un arreglo dinámico de estructuras */ int main(void) { FILE *pf = fopen("file.txt", "r"); int n; char string[80], c; unsigned i; for(i = 0; i < n; i++) { fscanf(pf , "%80s %c", cuerpos [i ]. nombre, &cuerpos [i ]. cod); printf("[%s][%c]\n", cuerpos [i ]. nombre, cuerpos [i ]. cod); } return 0; }
file.txt es el mismo archivo que has puesto. #include <stdio.h> #include <stdlib.h> struct _cuerpos { char nombre[80]; char cod; } *cuerpos; int main(void) { unsigned n, i; FILE *fp = fopen("file.txt", "r"); if(fp == NULL) { perror("Error abriendo archivo"); } /* Crear el arreglo dinámico */ cuerpos = malloc(sizeof(struct _cuerpos ) * n ); for(i = 0; i < n; i++) { fscanf(fp , "%s %c", cuerpos [i ]. nombre, &cuerpos [i ]. cod); printf("[%s][%c]\n", cuerpos [i ]. nombre, cuerpos [i ]. cod); } return EXIT_SUCCESS; }
|
|
« Última modificación: 6 Julio 2011, 00:14 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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: fscanf(pf ,"%s",planet_info [i -1]. nombre); 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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda con metodos de un archivo (estructura de datos)
Programación General
|
crifesma
|
0
|
2,003
|
3 Junio 2011, 03:02 am
por crifesma
|
|
|
Conoce las compañías de Internet que cifran tus datos correctamente
Noticias
|
wolfbcn
|
0
|
1,435
|
24 Noviembre 2013, 13:01 pm
por wolfbcn
|
|
|
No lee bien los datos de entrada
.NET (C#, VB.NET, ASP)
|
Meta
|
1
|
3,152
|
25 Febrero 2021, 12:14 pm
por Meta
|
|
|
Guardar datos correctamente en un archivo
Scripting
|
Meta
|
2
|
2,737
|
11 Marzo 2022, 18:31 pm
por Serapis
|
|
|
Powershell no toma los datos correctamente.
Scripting
|
**Aincrad**
|
3
|
854
|
23 Agosto 2024, 22:09 pm
por Danielㅤ
|
|