使用C语言读取.txt文本数据构建链表时fscanf用法不当以及文件编码格式不对导致读取失败


问题描述

做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;
  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值