[SWU]怎么读取来自数据文件的m行n列的矩阵

[SWU]如何读取来自数据文件的m行n列的矩阵
有一个题是这样的:
读取数据文件的m行n列的矩阵,将矩阵转置之后输出到标准输出。
------解决方案--------------------
没实际编译链接调试,不保证对。仅供参考:
//读取数据文件的m行n列的矩阵,将矩阵转置之后输出到标准输出。
#include <stdio.h>
FILE *f;
int y,x,m,n;
int A[m][n];
int main() {
    m=3;
    n=4;
    f=fopen("data.txt","r");
    if (NULL==f) {
        fprintf(stderr,"Can not open file data.txt!\n");
        return 1;
    }
    for (y=0;y<m;y++) {
        for (x=0;x<n;x++) {
            if (1!=fscanf(f,"%d",&A[y][x])) {
                fprintf(stderr,"Can not read A[%d][%d]!\n",y,x);
                return 2;
            }
        }
    }
    fclose(f);
    for (x=0;x<n;x++) {
        for (y=0;y<m;y++) {
            printf("%d ",A[y][x]);
        }
        printf("\n");
    }
    return 0;
}

------解决方案--------------------
第5行int A[m][n];应改为int A[3][4];
第18行前应加一句fclose(f);
如果嫌m和n是写死不能动态修改的话,参考:
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19