Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 25 Septiembre 2016, 19:42 pm



Título: Ayuda T_T - Ejercicio de Archivos en C
Publicado por: palacio29 en 25 Septiembre 2016, 19:42 pm
Hola

Tengo un problema con un ejercicio de informatica. Me resulta imposible.
Lo que tengo que hacer es leer de un archivo txt que tengo en mi computadora que tiene el siguiente formato

37785443,agustin,francia
377685532,Pablo Rodriguez,Nicaragua

Osea el formato viene siendo DNI,Nombre,Pais. Esos datos guardados en un txt, cada dato separado con una coma.

Lo que tengo que hacer es agarrar ese archivo y mostrarlo por pantalla.
Hasta ahora hice lo siguiente

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    FILE*arch;
  8.    arch=fopen("C:\\Users\\PC\\Desktop\\personas2.txt","r");
  9.    int i=0,j=0,documento=0;
  10.    char aux,l;
  11.    char nombre[50]={0};
  12.    char pais[50]={0};
  13.  
  14.    while (!feof(arch))
  15.    {
  16.  
  17.        fscanf(arch,"%d",&documento);
  18.        fgetc(arch);
  19.        aux=fgetc(arch);
  20.        l=aux;
  21.        while (l!=',' && l!='\n' && i<50)
  22.        {
  23.  
  24.              nombre[i]=l;
  25.  
  26.  
  27.           aux=fgetc(arch);
  28.           l=aux;
  29.           i++;
  30.        }
  31.        nombre[i]='\0';
  32.        i=0;
  33.        aux=fgetc(arch);
  34.        l=aux;
  35.  
  36.        while (l!=',' && l!='\n' && i<50)
  37.        {
  38.  
  39.             pais[i]=l;
  40.  
  41.  
  42.             aux=fgetc(arch);
  43.             l=aux;
  44.             i++;
  45.        }
  46.        pais[i]='\0';
  47.        i=0;
  48.        printf("%d\t%s\t%s\n",documento,nombre,pais);
  49.    }
  50.    fclose(arch);
  51.  
  52.  
  53.  
  54.  
  55.    return 0;
  56. }
  57.  

El problema es que siempre me queda mal, o no me imprime un nombre, o imprime mal el país. Trato con varios valores y siempre la pifia
Lo que trato de hacer es que primero tome el documento y luego vaya tomando letra por letra hasta una coma y ahi poner \0.
Desde ayer que estoy con esto y no lo puedo sacar bien


Título: Re: Ayuda T_T - Ejercicio de Archivos en C
Publicado por: AlbertoBSD en 25 Septiembre 2016, 21:58 pm
Puedes usar funciones como strtok o strstr?

Saludos


Título: Re: Ayuda T_T - Ejercicio de Archivos en C
Publicado por: palacio29 en 26 Septiembre 2016, 03:44 am
Puedes usar funciones como strtok o strstr?

Saludos

Hola

Disculpa la demora. Ya lo hice y me salio pero tengo una duda que quizas lo sabes.

Este es el codigo finalizado. Basicamente saque el documento con el fprintf y para el nombre y el pais use dos while, cada parte  la guardaba en un arreglo y sacaba cada caracter con fgetc.
El problema es que supongamos que tengo esta linea en el archivo txt

37481881,pablo,argentina.

Cuando debuggeo el programa, cuando llega a la letra "o" de pablo, en vez de pasar a la coma como el proximo caracter, aparece que en la variable letra se guarda un "\r" que no se de donde viene y me obliga a hacer un if en cada while para evitar que tome el \r.
Me fije el archivo y obviamente no tiene un \r en ese lugar. Asi que no se porque me pasa eso.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    FILE*arch;
  7.    int doc;
  8.    int i=0;
  9.    int j=0;
  10.    char nombre[50];
  11.    char pais[50];
  12.    char letra;
  13.    arch=fopen("C:\\Users\\Pablo-PC\\Desktop\\personas.txt","r");
  14.    if (arch==NULL)
  15.    {
  16.        printf("Error.");
  17.    }
  18.  
  19.    printf("Documento\tNombre\t\tPais\n");
  20.    fscanf(arch,"%d,",&doc);
  21.    while(!feof(arch) && j<4)
  22.    {
  23.     letra=fgetc(arch);   ///Da la primera letra P
  24.     while(letra!=',' && i<50)
  25.     {
  26.         if (letra!='\r')
  27.         {
  28.          nombre[i]=letra;
  29.         i++;
  30.         }
  31.  
  32.         letra=fgetc(arch);
  33.     }
  34.     nombre[i]='\0';
  35.     i=0;
  36.  
  37.     letra=fgetc(arch);
  38.     while(letra!='\n')
  39.     {
  40.         if (letra!='\r')
  41.         {
  42.           pais[i]=letra;
  43.            i++;
  44.         }
  45.  
  46.         letra=fgetc(arch);
  47.     }
  48.     pais[i]='\0';
  49.     i=0;
  50.     j++;
  51.     printf("%d\t%s\t%s\n",doc,nombre,pais);
  52.    fscanf(arch,"%d,",&doc);
  53.    }
  54.  
  55.    fclose(arch);
  56.  
  57.    return 0;
  58. }
  59.  


Título: Re: Ayuda T_T - Ejercicio de Archivos en C
Publicado por: do-while en 26 Septiembre 2016, 14:32 pm
¡Buenas!

Lo del retorno de carro no se de donde te sale. De todas formas yo lo que haría, por simplicidad de código y sabiendo que cada campo está delimitado por comas, sería leer cada línea utilizando fgets (http://www.cplusplus.com/reference/cstdio/fgets/), que también extrae el salto de línea que hay al final de cada línea, (puedes suponer que cada campo tiene una cantidad menor a, por ejemplo, 100 caracteres, 300 en total), y utilizar cadenas para almacenar cada campo utilizando sscanf (http://www.cplusplus.com/reference/cstdio/sscanf/) para hacer una lectura con formato sobre la línea leída:
Código
  1. while(fgets(linea))
  2. {
  3.    sscanf(linea,"%s,%s,%s", dni, nombre, pais);
  4.    //ahora haces lo que quieras con esos datos
  5. }
  6.  

¡Saludos!

Acabo de ver que los nombres pueden tener espacios, así que el código anterior no sirve. En lugar de sscanf tendrías que utilizar strtok (http://www.cplusplus.com/reference/cstring/strtok/), incluida en string.h, utilizando la coma como delimitador, combinada con strcpy (http://www.cplusplus.com/reference/cstring/strcpy/).


Título: Re: Ayuda T_T - Ejercicio de Archivos en C
Publicado por: MAFUS en 26 Septiembre 2016, 14:36 pm
Este otro hiĺo
http://foro.elhacker.net/programacion_cc/solucionadoimposible_mostrar_texto_de_un_txt_en_c-t458200.0.html
está realuzando el mismo ejercicio y ya está marcado como resuelto. Pásatr por ahí a ver si puedes resolver tus dudas.