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

如何将文本文件内容读取存入二维数组?C语言成绩管理程序实现问题

成绩管理程序实现方案

现存问题梳理

  • 存储类型不合理:使用char数组存储成绩,仅能保存字符格式的数字,无法直接做数值运算,需要替换为int类型数组存储数值型成绩
  • 读取逻辑错误:同时调用fgets和fscanf操作同一个文件指针会导致读取位置偏移异常,原有循环终止条件arr[i-1][j]!=EOF未赋值就判断,完全不生效
  • 固定数组长度不符合需求:硬编码20x20的数组边界,无法适配学生、成绩数量不固定的场景

存储方案优化建议

如果还在入门阶段,可以先设定足够大的数组上限(比如最多支持100个学生、100门课)快速实现功能;后续熟练后可以用动态内存方案:通过malloc/realloc动态扩容二级指针数组,完全适配不定长需求,也不会浪费内存空间。

修正后完整代码(含读取+打印功能)

#include <stdio.h>
#include <string.h>

// 暂时设定上限,后续可替换为动态扩容实现
#define MAX_STUDENT 100
#define MAX_GRADE 100

int main() {
    int grades[MAX_STUDENT][MAX_GRADE] = {0};
    int student_cnt = 0; // 实际学生数
    int grade_cnt = 0; // 实际每人的成绩数
    char row[20];
    FILE *fp = fopen("grades.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    // 逐行读取成绩
    while (fgets(row, sizeof(row), fp) != NULL) {
        // 去掉行尾的换行符
        int len = strlen(row);
        if (row[len-1] == '\n') {
            len--;
            row[len] = '\0';
        }
        // 第一行确定成绩数量
        if (student_cnt == 0) {
            grade_cnt = len;
        }
        // 字符转int存入数组
        for (int j = 0; j < len; j++) {
            grades[student_cnt][j] = row[j] - '0';
        }
        student_cnt++;
        if (student_cnt >= MAX_STUDENT) break; // 到达上限停止读取
    }
    fclose(fp);

    // 打印成绩功能实现
    printf("共读取到%d名学生,每人%d门课成绩:\n", student_cnt, grade_cnt);
    for (int i = 0; i < student_cnt; i++) {
        printf("学生%d的成绩:", i+1);
        for (int j = 0; j < grade_cnt; j++) {
            printf("%d ", grades[i][j]);
        }
        // 可在此处扩展总成绩、平均分计算逻辑
        printf("\n");
    }

    return 0;
}

功能说明

  • 读取时自动将文本中的字符数字转换为int类型数值,可直接用于后续的分数统计、排序等操作
  • 自动适配你提供的grades.txt格式,无需修改分隔符即可读取
  • 打印功能按学生维度输出,可读性更高,可直接在打印循环里扩展总分、平均分计算逻辑

内容的提问来源于stack exchange,提问作者Silk.Road

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:06:06