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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:18:28