对于多维矩阵,fscanf不会从文件中读取正确的双精度数

时间:2017-11-10 05:26:02

标签: c file matrix double scanf

我正在尝试使用fscanf从文本文件中读取NxN矩阵和1xN矩阵的数字。我知道之前已经问过这个问题,但是我已经尝试过这些解决方案而根本无法理解为什么我的方法不起作用。 NxN矩阵是:

1 1 1
3 1 0
-1 0 1

和1xN矩阵是:

6 
11 
-2

行中的数字用一个空格分隔,列由\n分隔。这是我的代码:

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

int countlines(FILE *f);
void reduce_mat(double **matrix, double *vector, int row, int column);
void swapping(double **matrix, double *vector, int row, int column);
int main()
{
  FILE *f1=fopen("matrix.txt","r");
  FILE *f2=fopen("vector.txt","r");
  int dim_matrix=countlines(f1);
  int dim_vector=countlines(f2);

  //allocate memory for matrix and vector
  double **Mat_A=(double **) malloc(dim_matrix*sizeof(double));
  for(int j=0; j<dim_matrix; j++)
    Mat_A[j]=(double *) malloc(dim_matrix*sizeof(double));

  double *Vec_B=(double *) malloc(dim_vector*sizeof(double));

  //read in numbers from file
  for(int i=0; i<dim_matrix; i++)
  for(int j=0; j<dim_matrix; j++)
  {
    fscanf(f1,"%lf",&Mat_A[i][j]);
    printf("Mat_A[%d][%d]=%lf\n",i,j,Mat_A[i][j]);
  }
  for(int k=0; k<dim_vector; k++)
  {
    fscanf(f2, "%lf", &Vec_B[k]);
    printf("Vec_B[%d]=%lf\n",k,Vec_B[k]);
  }

 int countlines(FILE *f)
 {
 //check if file exists
  if (f==NULL)
  {
    printf("File does not exist");
    return 0;
  }
  int count=0; //intialize the count
  char c; //place to store characters from file
  for (c=getc(f); c!=EOF; c=getc(f))
  {
    if (c=='\n')
    {
      count+=1;
    }
  }
  return count;
 }

它只是为每个值打印出零。我曾尝试使用"%lf%[\n]%""%lf%"等。我只是无法弄清楚我哪里出错了,因为这种实现似乎适用于其他人。

1 个答案:

答案 0 :(得分:2)

计数行读取文件并使用数据。 您必须将其倒回到开头才能再次读取它以读取值。 因此,只需在rewind(f)函数的末尾添加countlines

 int countlines(FILE *f)   
 {
     //check if file exists
     if (f==NULL)
     {
         printf("File does not exist");
         return 0;
     }
     int count=0; //intialize the count
     int c; //place to store characters from file
     for (c=fgetc(f); c!=EOF; c=fgetc(f))
     {
         if ((char)c=='\n')
             count++;
     }
     rewind(f); // file is now ready to be read again  
     return count;
 }