我真的很亲近。
这将读取文件并使用gdb我可以看到我的文本文件中的单词转到链接列表。
然而,当我打印我的链表(代码的下半部分)时,整个链表似乎只包含重复文件中的最后一个单词,但文件中有很多条目。
bool load(const char* dictionary) {
// open dictionary
FILE* file = fopen(dictionary, "r");
if (file == NULL)
return false;
char buf[LENGTH];
//read the contents of the file and write to linked list
while (!feof(file)) {
fscanf(file,"%s", buf);
// try to instantiate node
node* newptr = malloc(sizeof(node));
if (newptr == NULL) {
return false;
}
// initialize node
newptr->next = NULL;
// add new word to linked list
newptr->dictword = buf;
//move node to start of linked list
newptr->next = first;
first = newptr;
}
fclose(file);
// traverse and print list.
node* ptr = first;
while (ptr != NULL) {
printf("%s\n", ptr->dictword);
ptr = ptr->next;
}
return true;
}
答案 0 :(得分:1)
您只有一个char buf[]
,您可以阅读每个单词。您在每个链接列表元素中保存指向该缓冲区的指针,但您立即读取数据。将它放入分配的node
时,需要复制它。最简单的方法是使用newptr->dictword = strdup(buf)
一步完成alloc和copy。
答案 1 :(得分:0)
假设 dictword 的大小 LENGTH 就像 buf 一样,即:
struct node {
...
...
char dictword[LENGTH];
...
...
};
您需要在代码中进行以下更改:
strcpy(newptr->dictword, buf);
问题是你只是将dictword设置为指向与链表的所有节点中的buf相同的内存。
更好的方法是为字符串动态分配内存:
struct node {
...
...
char* dictword;
...
...
};
newptr->dictword = (char*)malloc(strlen(buf) + 1);
strcpy(newptr->dictword, buf);
答案 2 :(得分:0)
我建议将strdup
解决方案作为BenJackson的解决方案。但它在标准C库中不存在。
以下是我的解决方法:
char *strdup(const char *data)
{
char *retval = malloc(strlen(data) + 1);
strcpy(retval, data);
return retval;
}
答案 3 :(得分:0)
使用feof表示你是 1.不使用unix环境并且不得不适应mingw无法在stdin中正确使用eof。 2.过度思考,实际上应该检查eof。
我通常这样做:
void* collection = ...;
FILE* filebehere = ...;
char buffer[1337];
while (fgets(buffer, 1337, filebehere)) {
if (strlen(buffer) != 0) {
buffer[strlen(buffer) - 1] = 0;
collection_insert(collection, buffer);
}
}
答案 4 :(得分:0)
该行存在问题:
// add new word to linked list
newptr->dictword = buf;
通过这种方式,你总是将引用传递给buf的开头到你的所有元素,所以当你更新“buf”时,所有的元素都会被更新。这就是你引用行为的原因。
尝试将其替换为:
newptr->dictword = (char*) malloc((strlen(buf)+1)*sizeof(char));
strcpy(newptr->dictword, buf);
“strlen(buf)+1”是存储在buf中的当前字符串的长度加上字符“\ 0”的空格,即字符串的结尾。
PS。假设您已使用char *声明了元素“dictword”。