问题描述
做C语言课设的时候想要通过读取文本的方式构建一个链表。
结构体
typedef struct grade {
char subject[15];//科目
char startTime[10];//学年,输入2022-09或2022-02
double credit;//该学科的学分
double usual;//平时成绩
double midterm;//期中成绩
double exam;//期末成绩
double final;//最终成绩,即绩点
char chongxiu;//是否为重修,是则Y,否则N
struct grade* next;
}GradeNode,* ListGrade;
创建头节点:
void InitListGrade(ListGrade* head) {
if ((*head = (ListGrade)malloc(sizeof(GradeNode))) == NULL) {
printf("磁盘空间分配出错,创建信息表失败!\n");
exit(-1);
}
(*head)->next = NULL;
}
使用带头节点的head开始构建链表:
struct grade* CreatList2(ListGrade head) {
int point = 0;
ListGrade gradenode,p=head;
FILE* fp;
if ((fp = fopen("D://学生成绩数据.txt", "r")) == NULL) {
printf("打开文件失败!请检查文件是否存在,若存在则请退出系统后再次登录。\n");
exit(-1);
}
while (1) {
gradenode = (ListGrade)malloc(sizeof(GradeNode));
if (EOF == fscanf(fp, "%s %s %.1lf %.1lf %.1lf %.1lf %.1lf %c", gradenode->subject, gradenode->startTime, &gradenode->usual, &gradenode->midterm, &gradenode->exam, &gradenode->final, &gradenode->chongxiu))
break;
p->next = gradenode;
gradenode->next = NULL;
p = gradenode;
}
fclose(fp);
return head;
}
要测试的数据:
原因分析:
遇到的问题1:
一开始没有注意.txt文件的编码格式,而记事本默认的是UTF-8,导致我读取不到正确的汉字字符。 >﹏<
遇到的问题二:
注意到上述问题后立马整改,原以为这就OK了,结果输出的是什么呀:
图一:vscode中的输出结果:
图二:VS2019的输出结果:
(代码在VS2019上写的,我会拿部分代码到vscode中测试一下,可能复制粘贴得不好吧,导致两个的输出结果不怎么一样)
这个问题搞得我一头雾水,改了很久也没结果。
最后去问学长的时候人家一下子就看出问题了:fscanf不可以指定小数位!
所以得把小数位都去掉。
改了之后确实可以正常构建链表了。
if (EOF == fscanf(fp, "%s %s %lf %lf %lf %lf %lf %s", gradenode->subject, gradenode->startTime,&gradenode->credit ,&gradenode->usual, &gradenode->midterm, &gradenode->exam,&gradenode->final, gradenode->chongxiu))
break;