Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 21 Junio 2020, 17:15 pm



Título: Leer un archivo de texto y meter el contenido en una lista
Publicado por: palacio29 en 21 Junio 2020, 17:15 pm
Buenos Dias

Tengo el siguiente problema.
Quiero leer un archivo de texto con el siguiente contenido:

Lopez,95128428,Chile
Lee,148284,China
Wondrio,95182,Brasil
Goku,591281,Japon

El primer contenido es el apellido, luego el DNI y por ultimo el pais.

Luego esto tengo que meterlo en una estructura y luego pasar cada uno de los datos de esa estructura a una lista.
Pude solucionar la mayoria de los problemas que tenia dividiendo la carga del archivo en funciones mas chicas y con eso se me hizo un poco más legible y el resultado es el esperado, pero el problema es que no se como hacer para hacer un ciclo while que me lea todas las lineas, ya que no puedo modificar el archivo y de la forma que hice la captura de datos, no encuentro forma

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct s_datos
  5. {
  6.    char*apellido;
  7.    int dni;
  8.    char*pais;
  9. };
  10. typedef struct s_datos t_dato;
  11.  
  12. struct s_nodo
  13. {
  14.    t_dato dato;
  15.    struct s_nodo*sig;
  16. };
  17. typedef struct s_nodo*t_nodo;
  18.  
  19. char* sacoapellido(FILE*arch);
  20. int sacodocumento(FILE*arch);
  21. char*sacopais(FILE*arch);
  22. void agregar(t_nodo*,t_dato);
  23. void imprimir(t_nodo);
  24.  
  25. int main()
  26. {
  27.    t_nodo lista=NULL;
  28.    t_dato aux;
  29.    char*txt=NULL;
  30.    char*txt2=NULL;
  31.    int r,i=0,doc;
  32.  
  33.    FILE*arch=NULL;
  34.    arch=fopen("personas.txt","r");
  35.    txt=sacoapellido(arch);
  36.    doc=sacodocumento(arch);
  37.    txt2=sacopais(arch);
  38.  
  39.    aux.apellido=txt;
  40.    aux.dni=doc;
  41.    aux.pais=txt2;
  42.  
  43.    agregar(&lista,aux);
  44.    txt=sacoapellido(arch);
  45.    doc=sacodocumento(arch);
  46.    txt2=sacopais(arch);
  47.    aux.apellido=txt;
  48.    aux.dni=doc;
  49.    aux.pais=txt2;
  50.    agregar(&lista,aux);
  51.   // printf("\nLos datos son: Apellido : %s - DNI: %d  - Pais: %s",aux.apellido,aux.dni,aux.pais);
  52.    imprimir(lista);
  53.  
  54.  
  55. }
  56. char*sacoapellido(FILE*arch)
  57. {
  58.    int i=0,r;
  59.    char*aux=NULL;
  60.    aux=malloc(sizeof(char));
  61.    r=fgetc(arch);
  62.    while(r!=',')
  63.    {
  64.        *(aux+i)=r;
  65.        i++;
  66.        aux=realloc(aux,(i+1)*sizeof(char));
  67.        r=fgetc(arch);
  68.    }
  69.    *(aux+i)='\0';
  70.    return aux;
  71. }
  72. int sacodocumento(FILE*arch)
  73. {
  74.    int documento;
  75.    fscanf(arch,"%d,",&documento);
  76.    return documento;
  77.  
  78. }
  79. char*sacopais(FILE*arch)
  80. {
  81.    int i=0,r;
  82.    char*aux=NULL;
  83.    aux=malloc(sizeof(char));
  84.    r=fgetc(arch);
  85.    while(r!='\n' && r!=EOF)
  86.    {
  87.        *(aux+i)=r;
  88.        i++;
  89.        aux=realloc(aux,(i+1)*sizeof(char));
  90.        r=fgetc(arch);
  91.    }
  92.    *(aux+i)='\0';
  93.    return aux;
  94. }
  95. void agregar(t_nodo*nodo,t_dato dato)
  96. {
  97.    if(*nodo==NULL)
  98.    {
  99.        *nodo=(t_nodo)malloc(sizeof(struct s_nodo));
  100.        (*nodo)->dato=dato;
  101.        (*nodo)->sig=NULL;
  102.    }
  103.    else
  104.    {
  105.        agregar(&(*nodo)->sig,dato);
  106.    }
  107. }
  108. void imprimir(t_nodo lista)
  109. {
  110.    while(lista!=NULL)
  111.    {
  112.        printf("Apellido: %s - DNI: %d - Pais: %s\n",lista->dato.apellido,lista->dato.dni,lista->dato.pais);
  113.        lista=lista->sig;
  114.    }
  115. }