将数据存档到C中的链表

时间:2013-02-27 23:13:55

标签: c

我真的很亲近。

这将读取文件并使用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;
}

5 个答案:

答案 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”。