如何在C中逐行将文件内容读入结构

时间:2011-02-14 08:19:12

标签: c data-structures struct

在这里,我试图逐行读取文件的内容,并为每一行创建一个结构。问题是当我打印单词列表时,它们中的每一个都是文件的最后一个单词(在此示例中为})。我相信,因为经常更改,我传递指向char的指针,每个结构的也会发生变化。我一直试图解决这个问题将近一天没有任何运气。将每个单词读入结构并将每个结构链接到链表的好方法是什么?

请注意,下面使用了一些辅助方法。我已多次测试它们并且它们正在工作。

令牌结构

    typedef struct token
    {
     char* value;
     struct token* next;
    }TOKEN;

文件内容

 target1:
 dependency1
 {
 command1,
 command2
 }

主要

    TOKEN *head = NULL;
// represents each formatted line from the script file
char* line = malloc(161*sizeof(char));

FILE* fileRead = openFile("RawRules.txt", "r");

while((line = readLine(line, fileRead)) != NULL) 
{
    head = add(head, line);
}

displaylist(head);
freeNodes(head);
fclose(fileRead);

添加功能http://cprogramminglanguage.net/singly-linked-list-c-source-code.aspx修改

 TOKEN* add(TOKEN *head, char* value){
 TOKEN *tmp;

if(head == NULL){
    head=(TOKEN *)malloc(sizeof(TOKEN));
    if(head == NULL){
        printf("Error! memory is not available\n");
        exit(0);
    }
    head-> value = value;
    head-> next = head; 
}else{
    tmp = head;

    while (tmp-> next != head)
        tmp = tmp-> next;
    tmp-> next = (TOKEN *)malloc(sizeof(TOKEN)); 
    if(tmp -> next == NULL)
    {
        printf("Error! memory is not available\n");
        exit(0);
    }
    tmp = tmp-> next;
    tmp-> value = value;
    tmp-> next = head;
}
return head;

}

readline功能

 // reads a line of a file into buffer
 char* readLine(char* buffer, FILE* file) {
buffer = fgets(buffer, 161, file);
return buffer;
 }

这无法解决问题

    while(true) 
{
    char* ll = malloc(161*sizeof(char));
    ll = readLine(ll, fileRead);

    f(ll != NULL)
        head = add(head, ll);
    else 
        break;
}

对不起,我十亿年前就用C编程了,所以叫我一个菜鸟!

1 个答案:

答案 0 :(得分:2)

add()函数中,您只需分配char *,而不是为每个字符串分配任何新内存(然后复制)。所以每个TOKEN最终指向原始缓冲区。当你在顶级使用单个缓冲区时,你会一遍又一遍地覆盖它。

简而言之:每行需要一个单独的缓冲区。一种方式(不一定是最好的方式)是在add()

中执行以下操作
int len = strlen(value);

...

tmp->value = malloc(len+1); /* +1 for null terminator */
strncpy(tmp->value, value, len+1);

请记住,在某些时候,您需要free()所有这些额外的缓冲区。