如何将文本文件内容读取存入二维数组?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
相关产品推荐
相关产品推荐

