如何从文本文件中读取格式化的行并将信息保存在链表中? IN C.

时间:2013-11-22 17:28:17

标签: c file text fgets scanf

我有一个代码,我正在使用指针处理链接列表(实际上它更像是一个堆栈,因为它在顶部添加了节点)。现在我需要用这样的行读取文本文件:

NAME, AGE, COUNTRY
NAME2, AGE2, COUNTRY2

依此类推......然后,将每行中的三个值分配给三个不同的变量,这样我就可以将这些值分配给每个节点。像这样:

char * name int age char * country;

我不知道每个char的大小,这就是我不能使用数组的原因。对不起,如果我不是很好解释,但英语不是我的第一语言。无论如何,这就是我所拥有的:

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

typedef struct {
    // informacion contenida en el nodo
    int dato;
    int dato2;
    char *texto;
    // propiedades del nodo
    struct nodo *siguiente;
} nodo;

nodo *crearNodo(){
    nodo *L = malloc(sizeof(nodo));
    L->siguiente = NULL;
    return L;
}

nodo *agregar(nodo *n, char *buffer){
    // creo nodo temporal y le asigno espacio
    nodo *temp;
    char *lineaAux;
    temp = (nodo *)malloc(sizeof(nodo));

    // hago que el nodo temporal apunte a lo mismo que la cabecera
    temp->siguiente = n->siguiente;
    // le asigno datos al nodo temporal
    lineaAux = strtok(buffer, ",");
    temp->dato = atoi(lineaAux);

    lineaAux = strtok(NULL, ",");
    temp->dato2 = atoi(lineaAux);

    temp->texto = (char *)malloc(30*sizeof(char));
    lineaAux = strtok(NULL, "\n");
    temp->texto = lineaAux;
    // hago que la cabecera sea el nodo temporal, es decir, lo inserto adelante. Empujo.
    n->siguiente = temp;
    return n;
}

nodo *cargar(nodo *votantes, char *archivo){
    FILE *txt = fopen(archivo, "r");

    if(txt == NULL){
        printf("chupalo");
    } else {
        char *buffer = (char *)malloc(512*sizeof(char));
        while(!feof(txt)){
            buffer = fgets(buffer, 512, txt);
            votantes = agregar(votantes, buffer);
        }
    }
    fclose(txt);
    return votantes;
}

void mostrar(nodo *n){
    nodo *aux;
    if(n->siguiente == NULL){
        printf("Lista vacia ");
    } else {
        aux = n->siguiente;
        do {
            printf("dato1: %d dato2: %d dato3: %s\n", aux->dato, aux->dato2, aux->texto);
            aux = aux->siguiente;
        }
        while(aux != NULL);
    }
}

main(){
    nodo *listaEnlazada = crearNodo();
    char *txt = "lista.txt";
    listaEnlazada = cargar(listaEnlazada, txt);
    mostrar(listaEnlazada);
    return 0;
}

编辑:-------------------

啊哈哈哈,对,我没有说出来。 好吧,如果我在文本文件中有这个:

1, word
2, word2
3, word3

我的程序打印

num: 3 - word: word3
num: 2 - word: word3
num: 1 - word: word3

我的意思是,它就像char *它被覆盖了什么,我不知道问题出在哪里。

1 个答案:

答案 0 :(得分:1)

*agregar(nodo *n, char *buffer)中更改此内容:

temp->texto = lineaAux;

strncpy(temp->texto, lineaAux, 30);

指针lineaAux将指向最后读取的内容,因此每个节点的texto ptr也是如此。将lineaAux的内容复制到文本。

你也有dato的问题。从文件看起来它应该是一个字符串(它是一个名字,对吧?)但是你把它当成一个整数。

还要重新考虑如何阅读文件并检查EOF并考虑这样的事情是否更好(假设文件中没有空白行 - 您应该在盲目地使用strtok数据之前检查可能不存在):

    while ((buffer = fgets(buffer, 512, txt)) != NULL)
    {
        votantes = agregar(votantes, buffer);
    }