如何在C语言中读取非均匀维度矩阵文本并存储为二维数组?
解决C语言读取不规则行数文本到固定二维数组的问题
问题原因
你的代码中fscanf("%d", &a[i][j])会忽略所有空白字符(包括空格、换行、制表符等),它不会识别文本中的行边界,只会连续读取文件中的整数。这就导致当某一行的数字数量不足COLS时,它会直接读取下一行的数字来填充当前行的剩余列,最终出现你看到的跨行合并的结果。
解决方案
C语言完全可以实现你的需求,核心是要识别文本中的行边界,确保每行的数字只填充到对应行的数组元素中。下面提供两种可行的实现方式:
方式一:逐行读取并解析(推荐)
先通过fgets读取整行文本,再从每行中解析出整数,填充到对应行的数组中,未填满的列保持初始化的0。
#include <stdio.h> #include <string.h> #define ROWS 3 #define COLS 8 #define MAX_LINE_LENGTH 100 // 根据实际情况调整每行最大长度 int main() { int a[ROWS][COLS] = {0}; int i, j; FILE *in = fopen("data.txt", "r"); // 检查文件是否成功打开 if (!in) { perror("无法打开文件"); return 1; } char line[MAX_LINE_LENGTH]; for (i = 0; i < ROWS; i++) { // 读取当前行,若文件提前结束则退出循环 if (fgets(line, MAX_LINE_LENGTH, in) == NULL) { break; } char *current = line; int num, chars_read; j = 0; // 从当前行解析整数,直到填满当前行或解析完所有数字 while (sscanf(current, "%d%n", &num, &chars_read) == 1 && j < COLS) { a[i][j++] = num; current += chars_read; // 移动指针到下一个数字的起始位置 } } fclose(in); // 输出结果 for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
方式二:读取时检查换行符
在读取每个整数后,检查下一个字符是否为换行符,若是则结束当前行的读取,确保下一个整数填充到下一行的数组中。
#include <stdio.h> #define ROWS 3 #define COLS 8 int main() { int a[ROWS][COLS] = {0}; int i, j; FILE *in = fopen("data.txt", "r"); if (!in) { perror("无法打开文件"); return 1; } for (i = 0; i < ROWS; i++) { j = 0; while (j < COLS) { int num; // 读取整数,若读取失败(文件结束)则退出循环 if (fscanf(in, "%d", &num) != 1) { break; } a[i][j++] = num; // 读取下一个字符,判断是否为换行 int c = fgetc(in); if (c == '\n' || c == EOF) { break; } ungetc(c, in); // 若不是换行,将字符放回输入流 } } fclose(in); // 输出结果 for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
说明
两种方式都能实现你期望的输出:每行数字填满后剩余列补0,下一行从新的数组行开始填充。第一种逐行解析的方式更灵活,适合处理每行长度差异较大的情况;第二种方式更贴近你最初的代码逻辑,修改量较小。
内容的提问来源于stack exchange,提问作者Isuckatcoding
相关产品推荐
相关产品推荐

