在c中将文本文件输入到2d数组中

时间:2017-09-30 06:37:56

标签: c arrays matrix

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

int main() {

  FILE* file = fopen ("fourth.txt", "r");
  int i = 0;
  int rows=0;
  int rows2=0;
  int columns=0;
  int counter=0;
  int length=0;
  int multiply=0;

  fscanf (file, "%d", &i);
  rows=i;

  printf("the rows are %d\n", i);

  int matrix[rows][rows];
  length=rows*rows;

  if (rows<=0) {

      printf("error, this file cannot be processed");
      return 0;
  }

  do
  {
      if (fscanf(file, "%d", &i)==1) {

          if (counter<length) {

              matrix[rows2][columns]=i;
              counter++;
              columns++;

              if (columns==rows) {
                  rows2++;
                  columns=0;
              }
          }
          multiply=i;
      }
  } while (!feof(file));

  fclose (file);

  for ( int c = 0; c < rows; c++ ) {
      for ( int j = 0; j < rows; j++ ) {
          printf("matrix[%d][%d] = %d\n", c,j, matrix[c][j] );
       }
  }

  printf("the multiply is %d", multiply);

我正在尝试创建矩阵指数(用另一个词表示矩阵乘法)。然而,在我执行实际的数学过程之前,我必须从txt文件读取数字作为输入并将它们存储在2d数组中。上面是我到目前为止从代码中得到的,然而,我正在努力将数字实际输入到数组中,因为当我在最后测试我的2d数组时,我得到奇怪的结果。

例如: 1.输入:

  

3
     123个
     456个
     789个
     2

3表示行数,与此特定2d数组的列数相同,因为矩阵是方形的,意思是 所有行和列都是相同的。

2表示指数,它是我必须将原始矩阵乘以其自身的次数。

但是我的输出是

  

矩阵[0] [0] = 123
     matrix [0] [1] = 456,
     矩阵[0] [2] = 789
     矩阵[1] [0] = 2
     矩阵[1] [1] = 4214800
     矩阵[1] [2] = 0
     矩阵[2] [0] = 3
     矩阵[2] [1] = 0
     矩阵[2] [2] = 0

预期产出必须是:

  

123
     456个
     789

在二维数组中

有原因吗?

另外,我将如何修改代码,因此无论txt文件中有关不同行和列的输入是什么,我仍然可以格式化正确的2d数组。谢谢

1 个答案:

答案 0 :(得分:0)

在输入文本文件中,行中的数字不会以任何方式分开。如果您需要多位数字,请考虑用空格或分号等符号分隔它们。

如果矩阵只有一位数的整数(即0到9之间的数字),那就没问题了。

但如果一行中有3个数字,例如21,13和4,则在输入文件中它只是21134

无法找到211,3,4或21,1,34或2,113,4或.......

使用程序中的fscanf(),每个%d都会读取整行,将其视为单个数字并将其分配给变量i

而不是首先将尺寸读入i,然后将其复制到rows

fscanf (file, "%d", &i);
rows=i;

您可以直接阅读rows

fscanf( file, "%d", &rows);

并阅读像

这样的值
for(rows2=0; rows2<rows; ++rows2)
{
    if( fscanf(file, "%1d%1d%1d", &matrix[rows2][0], &matrix[rows2][1], &matrix[rows2][2]) != 3)
    {
        perror("Error");
        break;
    }
}

然后在最后阅读multiply的值,如

fscanf(file, "%d", &multiply);

您可以检查fscanf()的返回值,以检查是否发生错误。

您使用!feof(file)检查文件结尾。我不太了解,但看看here