c - 逐行读取文件到结构
问题描述
我想读取一个看起来像这样的文件:
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;
}
解决方案
该代码有以下问题:
tail
永远不要在添加到空列表的情况下正确设置。- 在添加到非空列表的情况下泄漏内存(两次)。
- 在添加到非空列表的情况下排序添加节点,但在执行此操作时会泄漏内存。
该函数应如下所示:
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;
}
就是这样。
推荐阅读
- duktape - 如何使用 duk_pcall 多次运行整个 js 文件?
- architecture - “清洁架构”博客文章:为什么实体不跨越边界?
- html - CSS动画:悬停和悬停
- charts - 有谁知道图形单词图表的名称?
- javascript - 如何获取字符串中双下划线之间的数字并将其与另一个数字相乘?
- ios - Agora IO 中的后台调用 [React-Native iOS]
- python - QueuePool 限制和超时问题
- c++ - 为什么我在 CSES Coin Combination 2 上获得 TLE?
- qt - 使用 Tab 键选择按钮的代码
- security - “用另一个证书签署证书”是什么意思?