Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中逐行将文件内容读入结构_C_Data Structures_Struct - Fatal编程技术网

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

如何在C中逐行将文件内容读入结构,c,data-structures,struct,C,Data Structures,Struct,在这里,我试图逐行读取文件的内容,并为每一行创建一个结构。问题是当我打印单词列表时,每一个单词都是文件的最后一个单词(在本示例中为})。我相信,由于行经常更改,并且我传递了一个指向字符的指针,因此每个结构的值也会更改。我一直在试图解决这个问题,几乎一天都没有任何运气。将每个单词读入结构并将每个结构链接到链接列表的好方法是什么 请注意,下面使用了一些助手方法。我已经对它们进行了多次测试,它们正在工作 令牌结构 typedef struct token { char* va

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

请注意,下面使用了一些助手方法。我已经对它们进行了多次测试,它们正在工作

令牌结构

    typedef struct token
    {
     char* value;
     struct token* next;
    }TOKEN;
 target1:
 dependency1
 {
 command1,
 command2
 }
文件内容

    typedef struct token
    {
     char* value;
     struct token* next;
    }TOKEN;
 target1:
 dependency1
 {
 command1,
 command2
 }
Main

    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);
 // reads a line of a file into buffer
 char* readLine(char* buffer, FILE* file) {
buffer = fgets(buffer, 161, file);
return buffer;
 }
添加功能修改自

}

读线功能

    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);
 // 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编程的,所以叫我noob吧

add()
函数中,您只需分配一个
char*
,而不是为每个字符串分配任何新内存(然后复制)。因此,每个
标记都指向原始缓冲区。当您在顶层使用单个缓冲区时,您会一次又一次地覆盖它

简而言之:每行需要一个单独的缓冲区。一种方法(不一定是最好的方法)是在
add()中执行以下操作:


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

将文件的一行读入“行”。每行最多应为160个字符。您的代码99%运行良好,或者可能我的代码仍在某个地方被破坏。输出将是正确的,但输出的第一行(即第一个结构数据)将是文件的最后一行。此外,在链表的最末端还有一个额外的结构。它包含同一行(文件的最后一行)