C语言循环内使用fscanf读取文件内容异常问题求助
代码问题分析与修复方案
存在的问题
- 错误1:统计变量未初始化
studentsPassed和studentsFailed是局部自动变量,声明时未赋初始值,默认是内存中的随机垃圾值,最终输出自然异常。 - 错误2:错把
fscanf返回值当成成绩判断fscanf的返回值是成功读取的变量个数,不是读取到的成绩值。你当前代码里直接判断fscanf(...) <40,而读取1个int成功时fscanf返回1,永远小于40,所以每次都会走不及格的分支。 - 错误3:循环内重复调用
fscanf导致多读数据
if分支调用一次fscanf读一个数,else if分支又调用一次fscanf再读一个数,单轮循环最多读2个成绩,20次循环要读40个值,远超过文件里的20个成绩,后续读不到数据就会返回EOF(值为-1),统计逻辑完全错乱。 - 错误4:分支内重定义同名变量屏蔽外层变量
你在if和else if分支里又写了int studentsFailed = ...、int studentsPassed = ...,等于在分支内新建了局部变量,完全没有修改外层声明的统计变量,外层的统计变量从头到尾都没被赋值,输出自然是随机值。 - (补充最初版本问题)循环外仅读取一次成绩,循环内没有更新
studentMark的值,相当于用同一个成绩判断了20次,统计结果肯定不对。
修正后完整代码
#include <stdio.h> int main(){ FILE *fp; // 新增文件打开判空逻辑,避免文件不存在时崩溃 fp = fopen("marks.txt", "r"); if(fp == NULL){ printf("无法打开成绩文件!\n"); return 1; } int moduleCode, numStudents; int studentMark; // 统计变量初始化赋值为0 int studentsPassed = 0; int studentsFailed = 0; // 读取第一行的课程号和总人数 fscanf(fp, "%d %d", &moduleCode, &numStudents); // 直接用读取到的numStudents当循环次数,不用写死数值,适配性更强 for (int i = 0; i < numStudents; i++){ // 先读取成绩到studentMark,再判断成绩是否及格 if(fscanf(fp, "%d", &studentMark) != 1){ printf("Error: 成绩数量不足!"); fclose(fp); return 0; } if(studentMark < 40){ studentsFailed++; }else{ studentsPassed++; } } // 输出结果 printf("%d %d\n", moduleCode, numStudents); printf("Number of students passed: %d\n", studentsPassed); printf("Number of students failed: %d\n", studentsFailed); // 新增文件关闭逻辑,避免资源泄漏 fclose(fp); return 0; }
运行结果说明
按照你提供的成绩文件统计,小于40的成绩有23、31共2个,运行修正后的代码会输出及格人数18、不及格人数2,符合预期。
内容的提问来源于stack exchange,提问作者user17221554
相关产品推荐
相关产品推荐

