逐行读取文件到结构

Posted

技术标签:

【中文标题】逐行读取文件到结构【英文标题】:Read a file line by line to struct 【发布时间】:2020-08-15 20:58:39 【问题描述】:

我想读取一个看起来像这样的文件:

Spyros 1
George 2
John 3

我想将每个学生存储在一个结构中:

typedef struct studentR *student;
struct studentR
   char name[MAXSTRING];
   int id;
   student next;
;

我已经编写了以下代码,它可以满足我的需求,但仅适用于第一行。如何将其移至下一行?

while(fscanf(fp, "%s %d", st->name, &st->id) != EOF)
    l = list_push_back(l, st->name, st->id);

这里是 list_push_back

//enters the new student in the end of the list
list list_push_back(list l, char *name, int id)
    student new_student = (student)malloc(sizeof(struct studentR));
    assert(new_student);

    strcpy(new_student->name, name);
    new_student->id = id;
    new_student->next = NULL;
    
    //push payload(stsudent data) at the top if the list is empty
    if (list_isempty(l))
    
        l->head = new_student;
        l->tail = new_student->next;
        l->size++;
    else
        //push the payload(student data) at the bottom if the list is NOT empty
        student last = (student)malloc(sizeof(struct studentR));
        assert(last); 
        last->next = new_student;
        l->tail = new_student;
        l->size++;
    

    return l;

【问题讨论】:

我知道隐藏指针的事情。我们的老师给我们看了。不知道为什么。我还包括了 list_push_back 函数 HInt:当第一个节点添加到您的列表时,headtail both 应该指向什么?您的代码做了什么符合该标准?此外,您正在泄漏内存,并且在非空列表情况下未插入包含任何数据的节点。关于指针类型别名,您的老师向您展示最终是一个坏习惯是一种证明,不一定是奉承。 【参考方案1】:

该代码有以下问题:

永远不要在添加到空列表的情况下正确设置tail。 add-to-not-empty-list 情况下的内存泄漏(两次)。 在添加到非空列表的情况下排序添加节点,但在执行此操作时会泄漏内存。

该函数应如下所示:

list list_push_back(list l, const char *name, int id)

    student new_student = malloc(sizeof *new_student);
    assert(new_student);

    strcpy(new_student->name, name);
    new_student->id = id;
    new_student->next = NULL;

    if (l->size == 0)
    
        l->head = new_student;
    
    else
    
        l->tail->next = new_student;
    
    l->tail = new_student;
    l->size++;

    return l;

这就是全部

【讨论】:

以上是关于逐行读取文件到结构的主要内容,如果未能解决你的问题,请参考以下文章

C++ 逐行读取文件,然后使用分隔符分割每一行

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

c语言逐行读取文件?

DELPHI中逐行读取并复制

vbs逐行读取txt文件并且逐行复制文件到其它文件中

如何用VBS逐行读取文本文件的内容,并输入变量