C - 从文件中读取未知大小的矩阵

时间:2015-04-05 19:16:28

标签: c file-io matrix

我的文件有30个矩阵,每个矩阵都有未知的行和列大小(最大大小为1000)。例如:

0 5 2
5 0 2
1 6 0

0 9 7 4
3 0 9 1
9 1 0 4
9 4 1 0

我需要将每个矩阵读入2d数组。这样做最有效的方法是什么?

这是我到目前为止所做的:

int** mat=malloc(1000000*sizeof(int*)); 
for(i=0;i<1000000;++i)
    mat[i]=malloc(4*sizeof(int));

while(!feof(file))
    {
        for(i=0;i<1000;i++)
        {
            for(j=0;j<1000;j++){
                fscanf(file,"%d%*[^\n]%*c",&mat[i][j]);
                printf("%d\n", mat[i][j]);
               }
        }
    } 

2 个答案:

答案 0 :(得分:0)

最有效的方法绝对不是那样的。首先弄清楚你需要多大的数组,然后分配它。

答案 1 :(得分:0)

显然有些矩阵很小,所以不需要分配最大大小1000x1000。一种方法是将矩阵放在一个结构中,以便更容易跟踪大小:

struct s_matrix
{
    int **matrix;
    int N; //one side of the square matrix N x N
};

typedef struct s_matrix Matrix;

然后分配并释放矩阵

void allocate_matrix(Matrix *m, int N)
{
    m->N = N;
    m->matrix = (int**)malloc(N * sizeof(int*));
    *m->matrix = (int*)malloc(N * N * sizeof(int));
    for (int i = 0; i < N; i++) 
        m->matrix[i] = *m->matrix + i * N;

    for (int i = 0; i < N; i++) 
        for (int j = 0; j < N; j++) 
            m->matrix[i][j] = 0; 
}

void free_matrix(Matrix *m)
{
    if (!m) return;
    if (!m->matrix) return;
    free(*m->matrix);
    free(m->matrix);
}

现在我们可以声明我们需要多少个矩阵。看起来这个数字固定为30,所以我认为我们不需要动态分配。

int main()
{
    const int max_count = 30;        
    Matrix list[max_count]; 
    for (int i = 0; i < max_count; i++) 
        list[i].matrix = NULL; 

    allocate_matrix(&list[0], 3);//allocate 3x3 matrix
    allocate_matrix(&list[1], 1000);//1000x1000
    allocate_matrix(&list[2], 4000);//4000x4000

    int **m;
    m = list[0].matrix;
    m[0][0] = 0; 
    m[0][1] = 1; 
    m[0][2] = 2; 
    for (int i = 0; i < 3; i++) 
        for (int j = 0; j < 3; j++) 
            printf("%02d %s", m[i][j], (j == 2) ? "\n" : ""); 
    //...

    for (int i = 0; i < max_count; i++) 
        free_matrix(&list[i]); 

    printf("hey it worked, or maybe it didn't, or it did but there is memory leak\n");

    return 0;
}