You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:45:00