C语言如何动态解析任意尺寸文本文件的二维数组数据
C语言动态解析任意尺寸矩阵文本文件实现方案
核心实现逻辑
不要硬编码每行读取的整数数量,按「先读尺寸→动态分配内存→按实际尺寸逐行解析」的流程处理即可适配任意合法行列数的矩阵文件:
- 打开文件后优先单独读取首行,解析出矩阵行数
ROW和列数COL,不要把首行解析和后续数据行解析混在同一套匹配逻辑里 - 根据解析到的
ROW和COL动态申请二维数组内存,无需提前固定数组长度 - 逐行读取后续数据时,按
COL值循环读取对应个数的整数,通过偏移量遍历行缓冲区内容,完全不依赖固定格式的sscanf参数列表
可直接参考的实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LINE_BUF_SIZE 2048 // 行缓冲区大小,可根据实际矩阵尺寸调整 int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "请传入矩阵文件路径作为参数\n"); return 1; } FILE *file = fopen(argv[1], "r"); if (file == NULL) { perror("文件打开失败"); return 1; } char line[LINE_BUF_SIZE]; int ROW, COL; // 第一步:单独读取首行解析行列数 if (fgets(line, sizeof(line), file) == NULL) { fprintf(stderr, "文件为空,无法读取矩阵尺寸\n"); fclose(file); return 1; } if (sscanf(line, "%d %d", &ROW, &COL) != 2) { fprintf(stderr, "首行格式错误,需包含两个整数分别表示行数和列数\n"); fclose(file); return 1; } printf("解析到矩阵尺寸:ROW=%d, COL=%d\n", ROW, COL); // 第二步:动态申请二维数组内存 int **matrix = (int**)malloc(ROW * sizeof(int*)); if (matrix == NULL) { perror("内存申请失败"); fclose(file); return 1; } for (int i = 0; i < ROW; i++) { matrix[i] = (int*)malloc(COL * sizeof(int)); if (matrix[i] == NULL) { perror("内存申请失败"); // 释放已经申请的内存避免泄漏 for (int k = 0; k < i; k++) free(matrix[k]); free(matrix); fclose(file); return 1; } } // 第三步:逐行解析矩阵数据 for (int i = 0; i < ROW; i++) { if (fgets(line, sizeof(line), file) == NULL) { fprintf(stderr, "文件提前结束,第%d行数据缺失\n", i+1); // 错误处理:释放内存、关文件 for (int k = 0; k < ROW; k++) free(matrix[k]); free(matrix); fclose(file); return 1; } char *p = line; int offset; for (int j = 0; j < COL; j++) { if (sscanf(p, "%d%n", &matrix[i][j], &offset) != 1) { fprintf(stderr, "第%d行数据格式错误,整数个数不足\n", i+2); for (int k = 0; k < ROW; k++) free(matrix[k]); free(matrix); fclose(file); return 1; } p += offset; // 指针移动到下一个待解析的位置 } } // 测试:打印解析完成的矩阵 printf("解析完成的矩阵内容:\n"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } // 资源释放 for (int i = 0; i < ROW; i++) free(matrix[i]); free(matrix); fclose(file); return 0; }
关键注意点
解析行内整数时用
%n格式符获取当前读取的字符偏移量,逐次移动行指针的写法,完全不需要提前固定每行读取的整数个数,不管是2×2还是100×100的矩阵都可以正常适配。不要写死sscanf里的%d个数,否则矩阵尺寸变化时代码必然失效。动态申请的内存使用完成后一定要逐行释放,避免内存泄漏;所有文件读取、内存申请的节点都要加错误校验,避免非法输入导致程序崩溃。
内容的提问来源于stack exchange,提问作者cookie9281
相关产品推荐
相关产品推荐

