首页 > 解决方案 > 如何添加从 c 中的文件编号读取的二维数组组?

问题描述

我需要读取一个包含数字的文件,并从这些数字中创建 4 行和 5 列矩阵。然后,我需要添加这些矩阵并打印总和矩阵(矩阵的数量取决于用户输入)。

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char *argv[]) {
    int a = 4;
    int b = 5;
    int m;
    
    scanf("%d", &m);
    FILE *file = fopen("matrix.txt", "r");
    
    int arr[a][b][m], i, j, k;

    for (i = 0; i < a; i++) {
        for (j = 0; j < b; j++) {
            for (m = 0; k < m; k++) {  
                fscanf(file, "%d", &arr[i][j][k]);
                arr[i][j] += arr[i][j];
            }
        }
    }

    for (i = 0; i < a;i++) {
        for (j = 0; j < b; j++) {
            for (k = 0; k < m; k++) {
                printf("%d", arr[i][j][k]);
                printf("\t");
            }
            printf("\n");
        }
    }
}

标签: arrayscfile

解决方案


您不需要将矩阵数据加载到单独的矩阵中,您可以在从文件中读取每个矩阵时即时添加矩阵内容:

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

void main(int argc, char *argv[]) {
    int m;
    
    if (scanf("%d", &m) != 1)
        return 1;

    const char *filename = "matrix.txt";
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        fprintf(stderr, "cannot open %s: %s\n", filename, strerror(errno));
        return 1;
    ]
    
    int a = 4;
    int b = 5;
    int sum[a][b];

    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            sum[i][j] = 0;
        }
    }

    for (int k = 0; k < m; k++) {
        for (int i = 0; i < a; i++) {
            for (int j = 0; j < b; j++) {
                int value;
                if (fscanf(file, "%d", &value) != 1) {
                    fprintf(stderr, "not enough data\n");
                    return 1;
                }
                sum[i][j] += value;
            }
        }
    }
    fclose(file);

    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }
    return 0;
}

如果您需要将所有数据加载到内存中,请使用矩阵数组:int arr[m][a][b];和 2 个单独的循环来读取和求和数据:

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

void main(int argc, char *argv[]) {
    int m;
    
    if (scanf("%d", &m) != 1)
        return 1;

    const char *filename = "matrix.txt";
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        fprintf(stderr, "cannot open %s: %s\n", filename, strerror(errno));
        return 1;
    ]
    
    int a = 4;
    int b = 5;
    int arr[m][a][b];

    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            sum[i][j] = 0;
        }
    }

    for (int k = 0; k < m; k++) {
        for (int i = 0; i < a; i++) {
            for (int j = 0; j < b; j++) {
                if (fscanf(file, "%d", &arr[k][i][j]) != 1) {
                    fprintf(stderr, "not enough data\n");
                    return 1;
                }
            }
        }
    }
    fclose(file);

    int sum[a][b];
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            int s = 0;
            for (int k = 0; k < m; k++) {
                s += arr[k][i][j];
            }
            sum[i][j] = s;
        }
    }

    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            printf("%d\t", sum[i][j]);
        }
        printf("\n");
    }
    return 0;
}

推荐阅读