user-0 提问: [SWU]如何读取来自数据文件的m行n列的矩阵

回复:
user: user-1
content: 主要考的就是矩阵转置

user: user-2
content: 1 #include <stdio.h>   2 #include <string.h>   3   4 int main()   5 {   6         FILE*   fp;   7         fp      = fopen("data.in", "r");   8   9         if(fp==NULL){  10                 // Failed to open file  11                 return -1;  12         }  13  14         // line buffer  15         int     line_number     = 0;  16         char    buffer[100];  17  18         // Gain file line number  19         while(1){  20                 fgets(buffer, 100, fp);  21                 if(feof(fp))  22                         break;  23                 line_number++;  24         }  25         printf("%s", buffer);  26         printf("%d\n", line_number);  27  28         // back the first line  29         rewind(fp);  30         int k;  31         k       = strlen(buffer)/2;  32         printf("%d\n", k);  33  34 } 此部分只是读取矩阵的行数和列数，至于矩阵转置楼上已经讲得很清楚了。

user: user-3
content: 引用 8 楼 arthuryangsh 的回复:m和n必须要通过某种方法来通知才行，比如文件第一行是m和n两个数。 有m,n 比较好读取 没有，可以让数据动态生长 或者干脆，先让每行不一样长，读一行转换一行。 最后，按照最长的一行数据的长度，重组矩阵。 不过这样就太麻烦了。  可以，让每行一样长，读取第一行数据，创建列数相同的矩阵。 以后逐行读取，行数动态增长即可。

user: user-0
content: 偶  那现在我说的fgets哪里为什么会有换行？

user: user-4
content: m和n必须要通过某种方法来通知才行，比如文件第一行是m和n两个数。

user: user-5
content: 如果数据列间隔不是空格，参考下面：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-5
content: 没实际编译链接调试，不保证对。仅供参考： //读取数据文件的m行n列的矩阵，将矩阵转置之后输出到标准输出。 #include <stdio.h> #define MAXMN 100 #define MAXC 1000 FILE *f; int y,x,m,n,k,v; int A[MAXMN][MAXMN]; char ln[MAXC],*p; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         fprintf(stderr,"Can not open file data.txt!\n");         return 1;     }     if (NULL==fgets(ln,MAXC,f)) {         fclose(f);         fprintf(stderr,"no data in data.txt!\n");         return 3;     }     n=0;     p=ln;     while (1) {         if (1==sscanf(p,"%d%n",&v,&k)) {             p+=k;             n++;             if (n>=MAXMN) {                 fprintf(stderr,"Too many columns(>%d truncked.\n",MAXMN);                 break;             }         } else break;     }     rewind(f);     y=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         p=ln;         for (x=0;x<n;x++) {             if (1!=sscanf(p,"%d%n",&A[y][x],&k)) {                 fprintf(stderr,"Can not read A[%d][%d]!\n",y,x);                 fclose(f);                 return 2;             } else {                 p+=k;             }         }         y++;         if (y>=MAXMN) {             fprintf(stderr,"Too many rows(>%d truncked.\n",MAXMN);             break;         }     }     m=y;     fclose(f);     for (x=0;x<n;x++) {         for (y=0;y<m;y++) {             printf("%d ",A[y][x]);         }         printf("\n");     }     return 0; }

user: user-0
content: 我就是想写一个程序，这个程序去读取数据文件的m*n的矩阵，然后将矩阵转置输出出来。 m和n的值我提前试不知道的。

user: user-0
content: 1#include <stdio.h>   2   3 void main()   4 {   5         int i, j, a[10][10];   6         FILE *fp;   7         fp      = fopen("data.in", "r");   8         for(i=0; i<10; i++){   9                 for(j=0; j<10; j++){  10                                 fscanf(fp, "%d", &a[i][j]);  11                                 if(feof(fp)){  12                                         printf("%d %d\n", i, j);  13                                         return;  14                                 }  15                 }  16         }  17 } 我写的数据文件是    1 2 3 4 5 6 想要他输出的结果是   2 3  但是结果是   0 6   也就是说他将这些元素读成了一维数组，不知何解？？？？

user: user-0
content: 但是如果我的数据文件里面不是一个三行四列的矩阵，而是五行六列  再或者是其他的呢？有没有一种方法可以实现，将这个矩阵变成动态的矩?

user: user-5
content: 第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

user: user-5
content: 没实际编译链接调试，不保证对。仅供参考： //读取数据文件的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; }