Leer un archivo de texto y meter el contenido en una lista

Iniciado por palacio29, 21 Junio 2020, 17:15 PM

0 Miembros y 1 Visitante están viendo este tema.

palacio29

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

#include <stdio.h>
#include <stdlib.h>

struct s_datos
{
    char*apellido;
    int dni;
    char*pais;
};
typedef struct s_datos t_dato;

struct s_nodo
{
    t_dato dato;
    struct s_nodo*sig;
};
typedef struct s_nodo*t_nodo;

char* sacoapellido(FILE*arch);
int sacodocumento(FILE*arch);
char*sacopais(FILE*arch);
void agregar(t_nodo*,t_dato);
void imprimir(t_nodo);

int main()
{
    t_nodo lista=NULL;
    t_dato aux;
    char*txt=NULL;
    char*txt2=NULL;
    int r,i=0,doc;

    FILE*arch=NULL;
    arch=fopen("personas.txt","r");
    txt=sacoapellido(arch);
    doc=sacodocumento(arch);
    txt2=sacopais(arch);

    aux.apellido=txt;
    aux.dni=doc;
    aux.pais=txt2;

    agregar(&lista,aux);
    txt=sacoapellido(arch);
    doc=sacodocumento(arch);
    txt2=sacopais(arch);
    aux.apellido=txt;
    aux.dni=doc;
    aux.pais=txt2;
    agregar(&lista,aux);
   // printf("\nLos datos son: Apellido : %s - DNI: %d  - Pais: %s",aux.apellido,aux.dni,aux.pais);
    imprimir(lista);


}
char*sacoapellido(FILE*arch)
{
    int i=0,r;
    char*aux=NULL;
    aux=malloc(sizeof(char));
    r=fgetc(arch);
    while(r!=',')
    {
        *(aux+i)=r;
        i++;
        aux=realloc(aux,(i+1)*sizeof(char));
        r=fgetc(arch);
    }
    *(aux+i)='\0';
    return aux;
}
int sacodocumento(FILE*arch)
{
    int documento;
    fscanf(arch,"%d,",&documento);
    return documento;

}
char*sacopais(FILE*arch)
{
    int i=0,r;
    char*aux=NULL;
    aux=malloc(sizeof(char));
    r=fgetc(arch);
    while(r!='\n' && r!=EOF)
    {
        *(aux+i)=r;
        i++;
        aux=realloc(aux,(i+1)*sizeof(char));
        r=fgetc(arch);
    }
    *(aux+i)='\0';
    return aux;
}
void agregar(t_nodo*nodo,t_dato dato)
{
    if(*nodo==NULL)
    {
        *nodo=(t_nodo)malloc(sizeof(struct s_nodo));
        (*nodo)->dato=dato;
        (*nodo)->sig=NULL;
    }
    else
    {
        agregar(&(*nodo)->sig,dato);
    }
}
void imprimir(t_nodo lista)
{
    while(lista!=NULL)
    {
        printf("Apellido: %s - DNI: %d - Pais: %s\n",lista->dato.apellido,lista->dato.dni,lista->dato.pais);
        lista=lista->sig;
    }
}