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

问题描述:

我有30个矩阵的文件,每个矩阵的行和列的大小未知(最大大小为1000)。例如:C - 从文件中读取未知大小的矩阵

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]); 
       } 
     } 
    } 
+0

高效率在哪? – Barracuda 2015-04-05 19:56:27

那么最有效的方式是绝对不说。首先找出你需要的数组有多大,然后分配它。

显然有些矩阵很小,所以不需要分配最大尺寸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; 
}