【发布时间】:2023-03-20 05:57:01
【问题描述】:
我在一个文件中有两个矩阵,格式如下:
17.053 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
1 3 1 4
0 5 0 4
2 1 2 4
这只是两个任意矩阵,它们总是用空行分隔。它们可以是任何大小和形状。我有以下代码读取两个矩阵并找出每个矩阵的行数和列数。如何将这些输入到定义为mat_A 和mat_B 的两个矩阵中?
我试过 fscanf 但我只打印出 0。如何将值读入应该保存它们的两个二维数组?
int main(void)
{
int space_count = 0;
int i = 0;
int j = 0;;
FILE *fp;
fp = fopen("inputformat", "r");
if(fp == NULL)
printf("File not read!");
int NumCols_first, NumCols_second, NumRows_first, NumRows_second;
int issecondmatrix = 0;
char *line = NULL;
size_t len = 0;
ssize_t read;
double **mat_A = (double **) malloc(NumRows_first * sizeof(double*));
for(i=0; i<NumRows_first; i++)
mat_A[i] = (double *) malloc(NumCols_first * sizeof(double));
double **mat_B = (double **) malloc(NumRows_second * sizeof(double*));
for(i=0; i<NumRows_second; i++)
mat_B[i] = (double *) malloc(NumCols_second * sizeof(double));
while((read = getline(&line, &len, fp)) != -1){
printf("Line is of length : %u \n", read);
printf("Line is:%s\n", line);
for(i=0; i<read; i++){
printf("%c\n", line[i]);
if(line[i] == ' ')
space_count++;
if(read == 1){
printf("Next matrix gonna start after this\n");
NumRows_first = j;
issecondmatrix = 1;
j = 0;
}
}
if(j==1 & issecondmatrix == 0)
NumCols_first = space_count + 1;
if(j==1 & issecondmatrix == 1)
NumCols_second = space_count + 1;
space_count = 0;
j++;
}
NumRows_second = j - 1;
printf("num of columns in first matrix is %d\n", NumCols_first);
printf("number of rows in first matrix is %d\n", NumRows_first);
printf("num of columns in second matrix is %d\n", NumCols_second);
printf("num of rows in second matrix is %d\n", NumRows_second);
for(i=0; i<NumRows_first)
{
for(j=0; j<NumCols_first; j++)
{
if(!(fscanf(fp, "%lf", &mat_A[i][j]))
break;
printf("%lf", mat_A[i][j]);
}
}
enter code here
free(line);
fclose(fp);
}
【问题讨论】:
-
fscanf()应该可以工作。你怎么称呼它?我在您的代码中找不到任何内容。顺便说一句:if(j==1 & issecondmatrix == 0)——你想要&&,而不是&。下一行也一样。 -
很抱歉,我没有意识到这部分被遗漏了。我已经更新了它。我不太确定如何阅读第二个矩阵。我第一次尝试这样,我只得到零
-
你在正确的轨道上。您可以简单地测试
if (*line = '\n')以捕捉换行符并在填充mat_A和mat_B之间切换。我会鼓励line与strtod一起执行所有值的转换。有很多重复的,我会试着找到一个。 -
但是为什么我在尝试打印 mat_A 时会得到 0?
-
既然你已经用
getline读过了,你需要先rewind()再用fscanf读(虽然我鼓励你用strtod把所有的值转换成double)