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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Leer archivo de texto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Leer archivo de texto  (Leído 6,167 veces)
niraikanai

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Leer archivo de texto
« en: 2 Marzo 2015, 20:27 pm »

Buen día a la comunidad!

Estuve intentando leer un archivo de texto con el siguiente formato:

Pablo#10#7/12/1990

Estoy empezando a llegar a la conclusión de que no es posible leerlo con un solo fscanf con los siguientes parámetros: fscanf(pF,"%s#%d/%d/%d",nombre,&dia,&mes,&ano);

¿Me podrían dar alguna guía sobre como encarar este problema?

Saludos!

Y muchísimas gracias por su tiempo.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Leer archivo de texto
« Respuesta #1 en: 2 Marzo 2015, 20:29 pm »

Lee la linea entera, y luego trabajas con ella.

La recorres hasta encontrar el primer #. Coges la primera parte. La recorres hasta el próximo #. Coges el número. Etc, etc.


En línea

niraikanai

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Leer archivo de texto
« Respuesta #2 en: 2 Marzo 2015, 20:34 pm »

Gracias por la pronta respuesta.

Te referís a por ejemplo:
leerla con un letra= fgetc(pF) caracter por caracter hasta el # y cuando llego a la parte de la fecha casteo el numero para pasarlo a un int?
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Leer archivo de texto
« Respuesta #3 en: 2 Marzo 2015, 20:35 pm »

Por ejemplo. Aunque mejor si lees primero la linea entera. Así ahorras tiempo.
En línea

niraikanai

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Leer archivo de texto
« Respuesta #4 en: 2 Marzo 2015, 21:19 pm »

Leo la linea con fgets. Por ejemplo fgets(linea, 80, pF)

Pero lo que no se me ocurre es como empezar a separar los distintos "campos". Alguna pista?
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Leer archivo de texto
« Respuesta #5 en: 3 Marzo 2015, 10:21 am »

Código
  1. int i = 0;
  2. char* line;
  3. /* Read from file */
  4. while(line[i]!='\0' && line[i]!='#')
  5.    ++i;

Al final de ese while, 'i' será el número de letras a coger para la primera cadena.

Código
  1. int j = 0;
  2. char name[i+1];
  3. while(j<i){
  4.    name[j] = line[j];
  5.    ++j;
  6. }
  7. name[i] = '\0';

Así, basta copiar la cadena al nuevo contenedor.
En línea

niraikanai

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Leer archivo de texto
« Respuesta #6 en: 3 Marzo 2015, 10:44 am »

Había resuelto antes de ir a dormir el ejercicio de otra forma. Pero es bastante más largo que tu solución. Consistía en hacer un ciclo while con fgetc. Pero debía utilizar 3 ciclos para captar toda una línea. En cambio, con tu método, es mucho más corto.

Me ha quedado clarísimo.

Muchas gracias!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Leer archivo de texto
« Respuesta #7 en: 5 Marzo 2015, 16:06 pm »

Estuve intentando leer un archivo de texto con el siguiente formato:

Pablo#10#7/12/1990

Estoy empezando a llegar a la conclusión de que no es posible leerlo con un solo fscanf con los siguientes parámetros:
Código:
fscanf(pF,"%s#%d/%d/%d",nombre,&dia,&mes,&ano);
Si tienes garantizada la estructura del archivo de texto puedes leer los cinco campos de cada registro con fscanf, un ejemplo de ello pero utilizando sscanf y un array para explicarlo mejor y de una manera mas fácil (eso espero) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *linea[] = {
  7.      "Hugo#14#7/12/1990",
  8.      "Paco#12#5/10/1988",
  9.      "Luis#10#3/08/1986",
  10.      "LINEA_SIN_EL_FORMATO_VALIDO"
  11.   };
  12.  
  13.   char nombre[100];
  14.   int num;
  15.   int d;
  16.   int m;
  17.   int a;
  18.   int i;
  19.  
  20.   for (
  21.      i = 0;
  22.      sscanf(linea[i], " %[^#]#%d#%d/%d/%d", nombre, &num, &d, &m, &a) == 5;
  23.      i++
  24.   )
  25.      printf("%s %d %d/%d/%d\n", nombre, num, d, m, a);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Otra opción es:
1) Leer cada linea con fgets.
2) Obtener cada uno de los componentes (separados por el carácter '#') con strtok.
3) Obtener los enteros del segundo y tercer componente con sscanf.

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
boy-ka

Desconectado Desconectado

Mensajes: 74


Ver Perfil
Re: Leer archivo de texto
« Respuesta #8 en: 1 Abril 2015, 21:54 pm »

Y si en caso de que el segundo dato no sea un entero, y sea un string? u otro tipo de dato?

 printf("%s %d %d/%d/%d\n", nombre, num, d, m, a);

Te marcaría error ya que %d hace referencia a que es un entero, por qué no mejor leer el texto entero como si fuese un string?, de esta manera

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.       char datos_leidos[100];
  8.       FILE * archivo;
  9.       archivo = fopen("archivoparaleer.txt","r");
  10.       if(archivo != NULL){
  11.           fgets(datos_leidos, 100, archivo);
  12.           cout <<datos_leidos <<endl;
  13.       }else{
  14.           cout <<"No se ha podido leer el archivo" <<endl;
  15.       }
  16.       getchar();          
  17.       return 0;
  18. }
  19.  
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Leer archivo de texto
« Respuesta #9 en: 2 Abril 2015, 03:30 am »

Y si en caso de que el segundo dato no sea un entero, y sea un string? u otro tipo de dato?

 printf("%s %d %d/%d/%d\n", nombre, num, d, m, a);

Te marcaría error ya que %d hace referencia a que es un entero
Por partes (todo lo que sigue es en buen plan):

1) El valor de retorno de las funciones scanf/fscanf/sscanf es el numero de conversiones realizadas con éxito.
2) En mi programa de ejemplo se verifica que se puedan leer las cinco conversiones, para ello es tan sencillo como verificar que el valor de retorno de la función sea igual a ... cinco.
3) Cuando se encuentra una linea que no cumple con ese formato (y eso sucede con el ultimo elemento del array, la cadena "LINEA_SIN_EL_FORMATO_VALIDO") la función retorna algún otro valor, la condición:
Código
  1. sscanf(linea[i], " %[^#]#%d#%d/%d/%d", nombre, &num, &d, &m, &a) == 5
Resulta en el valor cero (falso en C) y con ello el bucle termina su ejecución.

----

por qué no mejor leer el texto entero como si fuese un string?, de esta manera
En su tercer mensaje el creador del tema (me refiero al usuario niraikanai ) indica que utiliza esa función para leer las lineas de texto:
Leo la linea con fgets. Por ejemplo fgets(linea, 80, pF)

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] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
leer un archivo de texto
PHP
Zeroql 3 2,813 Último mensaje 24 Agosto 2007, 05:48 am
por дٳŦ٭
Leer todas las filas de un archivo de texto plano usando XSLT en Java
Java
Lind L. Tailor 0 2,132 Último mensaje 17 Marzo 2015, 23:42 pm
por Lind L. Tailor
Leer un archivo de texto con fscanf y ponerlo en un arreglo de float.
Programación C/C++
fafafa01 4 4,168 Último mensaje 17 Mayo 2016, 15:32 pm
por AlbertoBSD
Duda leer archivo de texto
Programación C/C++
RRjavier21 4 1,943 Último mensaje 7 Agosto 2018, 00:52 am
por ThunderCls
MOVIDO: Duda leer archivo de texto
.NET (C#, VB.NET, ASP)
Eleкtro 0 1,774 Último mensaje 6 Agosto 2018, 21:38 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines