问题描述
做C语言课设的时候想要通过读取文本的方式构建一个链表。
结构体
typedef struct grade {char subject[15];//科目char startTime[10];//学年,输入-09或-02double credit;//该学科的学分double usual;//平时成绩double midterm;//期中成绩double exam;//期末成绩double final;//最终成绩,即绩点char chongxiu;//是否为重修,是则Y,否则Nstruct 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中的输出结果:
图二:VS的输出结果:
(代码在VS上写的,我会拿部分代码到vscode中测试一下,可能复制粘贴得不好吧,导致两个的输出结果不怎么一样)
这个问题搞得我一头雾水,改了很久也没结果。😤
最后去问学长的时候人家一下子就看出问题了:fscanf不可以指定小数位o((⊙﹏⊙))o.
改了之后确实可以正常构建链表了。😁
佩服学长的本事时也感慨自己的无知,😑
被这个小点绊倒了这么久爬不起来,欸!😭 ≡(▔﹏▔)≡
如果觉得《使用C语言读取.txt文本数据构建链表时fscanf用法不当以及文件编码格式不对导致读取失败》对你有帮助,请点赞、收藏,并留下你的观点哦!