我正在尝试使用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%"
等。我只是无法弄清楚我哪里出错了,因为这种实现似乎适用于其他人。
答案 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;
}