如何仅使用FILE指针读取文件数据并计算课程平均分
正确实现课程平均分计算(仅使用FILE指针)
你的代码存在的问题
- 数据类型不匹配:
double类型的成绩必须用%lf读取,你用了%f,会导致数据读取错误 - 硬编码读取逻辑:一次性写死所有读取参数,代码冗余且不灵活,文件内容变动时必须修改格式串
- 课程ID初始化错误:你给
courseid初始化为1、2、3,和文件里的115、112、122完全不符 - printf参数错误:输出时传了变量的地址
&course[0].courseavg,应该直接传变量本身 - 未处理文件打开失败:如果
input.txt不存在,程序会直接崩溃 - 平均分计算僵化:固定按2个学生计算,无法适配更多学生的场景
正确实现思路
- 定义课程结构体,存储课程ID、总分、修课人数,后续用这两个值计算平均分
- 打开文件后先检查是否成功,避免异常崩溃
- 循环读取文件每一行数据,直到文件结束
- 对每个读取到的课程,匹配对应数组元素,累加总分和人数
- 遍历课程数组,计算每个课程的平均分
- 格式化输出结果
完整代码实现
#include <stdio.h> typedef struct { int courseid; double total; // 课程总分 int count; // 修该课程的学生人数 double avg; // 课程平均分 } Course; int main() { // 初始化课程数组,对应文件中的三个课程ID:115、112、122 Course courses[3] = { {115, 0.0, 0, 0.0}, {112, 0.0, 0, 0.0}, {122, 0.0, 0, 0.0} }; // 仅使用FILE指针打开文件 FILE *in = fopen("input.txt", "r"); if (in == NULL) { printf("无法打开文件 input.txt\n"); return 1; } int studentid, courseid; double grade; // 循环读取每一行数据,直到文件结束 while (fscanf(in, "%d %d %lf", &studentid, &courseid, &grade) == 3) { // 匹配对应课程,累加总分和人数 for (int i = 0; i < 3; i++) { if (courses[i].courseid == courseid) { courses[i].total += grade; courses[i].count++; break; } } } // 计算每个课程的平均分 for (int i = 0; i < 3; i++) { if (courses[i].count > 0) { courses[i].avg = courses[i].total / courses[i].count; } else { courses[i].avg = 0.0; // 无学生修读时平均分设为0 } } // 输出结果 printf("课程ID\t平均分\n"); for (int i = 0; i < 3; i++) { printf("%d\t%.1f\n", courses[i].courseid, courses[i].avg); } // 关闭文件 fclose(in); return 0; }
代码说明
- 用
while(fscanf(...) == 3)循环读取,确保每次读取一行的三个字段,自动处理文件结束 - 课程数组直接对应文件中的实际课程ID,避免匹配错误
- 通过
total和count统计数据,平均分计算逻辑灵活,支持任意数量的学生 - 增加文件打开失败的判断,提升程序稳定性
- 格式化输出结果,可读性更强
内容的提问来源于stack exchange,提问作者Rosaline
相关产品推荐
相关产品推荐

