从文件打印矩阵

时间:2011-03-27 10:00:07

标签: c

我使用此代码加载矩阵:

 FILE *inputMatrix=fopen("file","r");
 fscanf(inputMatrix,"%d",&num);
 for(i=0;i<num;++i){
    for(j=0;j<num+1;++j){
        fscanf(inputMatrix,"%f",&A[i][j]);
    }
 }
 fclose(inputMatrix);
 int numRow=num;
 int numColumn=num+1;

然后我想通过方法printMatrix打印它:

void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){
   int i = 0, j = 0;
   printf("nc: %i, nr: %i\n",numColumn,numRow);
    for(i = 0 ; i < numRow ; i++)
    {
        for(j = 0 ; j < numColumn ; j++)
        {
            printf("%.2f  ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

这是一个问题。当我在main中使用时:printf("matrix[1][1] is %f",matrix[1][1]) =&gt;它是从文件中成功加载的,但是当我尝试通过我的方法打印它时,也打印出来,我在矩阵中得到0.00。为什么这样?我错过了一些推荐吗?

4 个答案:

答案 0 :(得分:3)

您可以使用doublefloat类型作为矩阵数组。

答案 1 :(得分:2)

你有一个整数矩阵,因此你应该使用%d而不是%f /%.2f进行扫描/打印

答案 2 :(得分:1)

float A[10][11];

但是...

void printMatrix(int numColumn, int numRow ,int matrix[numRow][numColumn]){

float定义,但该方法需要int数组。我对此编译感到惊讶,但是gcc抛出了足够的警告,应该暂停一下:

$ gcc -o 5448492 5448492.c 
5448492.c:30: warning: conflicting types for ‘printMatrix’
5448492.c:24: note: previous implicit declaration of ‘printMatrix’ was here
5448492.c: In function ‘printMatrix’:
5448492.c:37: warning: format ‘%.2f’ expects type ‘double’, but argument 2 has type ‘int’

因为C需要在编译时知道除第一个数组索引以外的所有>,所以可以通过声明包含 last <的printMatrix()的原型来使程序功能正常运行/ em>数组索引大小。 (我在评论中说错了。抱歉。)

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

void printMatrix(int numColumn, int numRow ,float matrix[][11]);

int main (int argc,char *argv[]) {

  int num;
  int i,j;
  float A[10][11];

  FILE *inputMatrix=fopen("yourfile.in","r");
  fscanf(inputMatrix,"%d",&num);
  int numRow=num;
  int numColumn=num+1;

  for(i=0;i<numRow;++i){
     for(j=0;j<numColumn;++j){
         fscanf(inputMatrix,"%f",&A[i][j]);
     }
  }
  fclose(inputMatrix);

  printMatrix(numColumn,numRow,A);

  return 0;
}


void printMatrix(int numColumn, int numRow ,float matrix[][11]){
   int i = 0, j = 0;
   printf("nc: %i, nr: %i\n",numColumn,numRow);
     for(i = 0 ; i < numRow ; i++)
     {
       for(j = 0 ; j < numColumn ; j++)
       {
         printf("%f  ", matrix[i][j]);
       }
       printf("\n");
     }
     printf("\n");
}

输出:

$ ./5448492 
nc: 3, nr: 2
1.000000  1.000000  3.000000  
2.000000  2.000000  5.000000  

我在跟踪这个东西时摆弄了其他的东西(并且在两个空格处标准化了缩进;它非常小,但每次都非常喜欢的节拍不一致),但我很确定我唯一改变了实体是包含最后数组维度的函数的原型。

答案 3 :(得分:1)

如果你使用数组10x11,11也应该在其他地方进行硬编码。传递像这样的多维数组时,除最高级别之外的所有维度都必须进行硬编码。否则,您将得到错误的结果。

原因是你的函数认为数组有numColumn列,但内存中的数组实际上有11列。

我会做出这些改变:

include ...
...

-- note the *float** and the **[11]**
void printMatrix(int numColumn, int numRow ,float matrix[][11]);

int main (int argc,char *argv[]) {

  int num;
  int i,j;
  float A[10][11];  
...
}

-- note the *float** and the **[11]**
void printMatrix(int numColumn, int numRow ,float matrix[][11]){
...
}