我有一个代码,我正在使用指针处理链接列表(实际上它更像是一个堆栈,因为它在顶部添加了节点)。现在我需要用这样的行读取文本文件:
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 *它被覆盖了什么,我不知道问题出在哪里。
答案 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);
}