从C中的txt文件打印矩阵

时间:2019-02-24 19:25:47

标签: c matrix malloc

我必须从txt文件及其元素读取矩阵的行数和列数。第一行是行数和列数,其后是数字。例如,这是具有2行3列的矩阵(包含123 456)和具有3行2列的矩阵。 2 3 1 2 3 4 5 6。 3 2 1 2 3 4 5 6 我要做的是从同一个文本文件中读取两个矩阵并将它们相乘。我遇到一些未知的问题。

当我编写代码以测试矩阵是否正确填充时。我只得到第一个矩阵打印,然后程序停止。输出:1 2 3                                                                4 5 6

这是代码的一部分。提前致谢。

fn example(name: &mut str) {
    name.make_ascii_uppercase()
}

}

2 个答案:

答案 0 :(得分:0)

我认为我已经解决了这个问题,但是由于存在很多段错误,我不得不进行大量调试,因此我将原始问题的答案放在顶部,并将所有我不得不调试的事情推迟到底部。

fscanf(file, "%*[.]"); //this is to read the period in the file
fscanf(file,"%d %d", &row2, &col2);//row of second matrix

mat2=malloc(row2 * col2 * sizeof(int*));//create memory for second matrix

通过添加一行代码,它开始为我工作,但是由于下面的调试,它才开始工作。

由于对malloc的调用次数不代表已建立索引的嵌套Arary的数量,因此我不得不更改矩阵的声明,它们的填充方式以及它们的引用方式。

int *mat1,*mat2;

此声明是为了使下一个编辑有效。

//reading data for first matrix
for(i=0; i<row1; i++)
{
    for(j=0; j<col1; j++)
    {
        fscanf(file, "%d", &(mat1[i*col1 + j]));
    }
}
for(i=0; i<row1; i++)
{
    for(j=0; j<col1; j++)
    {
        printf("%d\t",mat1[i*col1 + j]);
    }
    printf("\n");
}

当然,对于第二个矩阵;

//reading data for second matrix

for(i=0; i<row2; i++)
{
    for(j=0; j<col2; j++)
    {
        fscanf(file,"%d",&(mat2[i*col2 + j]));
    }
}
for(i=0; i<row2; i++) //check mat2
{
    for(j=0; j<col2; j++)
    {
        printf("%d\t",(mat2[i*col2 + j]));
    }
    printf("\n");
}

请记住,如果要在数组内部引用数组,则需要在原始数组的每个插槽中为另一个数组分配空间。我选择了不直观的矩阵算术方法,但是可以对代码进行扩展以轻松地使用双数组索引。

答案 1 :(得分:0)

分配2D数组时遇到一些问题:

例如:

mat1=malloc(row1 * col1 * sizeof(int*));//create memory for first matrix

应该是

mat1=(int**)malloc(row1 * sizeof(int*));//create memory for first matrix

然后应将mat1中的每一行分配给矩阵中每个单元格scanf之前

for (i = 0; i < row1; i++)
{
    mat1[i] = malloc(col1 * sizeof(int));
    for (j = 0; j < col1; j++)
    {
        fscanf(file, "%d", &mat1[i][j]);
    }
}

然后,对mat2做类似的事情

这是我基于原始问题的解决方案:

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

int main() {
    int **mat1, **mat2, **result;
    int row1, col1, row2, col2;
    int i, j, k;
    FILE *file;

    char fname[100];

    printf("enter file name\n");
    scanf("%s", &fname);
    file = fopen(fname, "r");

    fscanf(file, "%d    %d", &row1, &col1);//row of first matrix

    mat1 = (int **)malloc(row1 * sizeof(int*));//create memory for first matrix
    //reading data for first matrix
    for (i = 0; i < row1; i++)
    {
        mat1[i] = malloc(col1 * sizeof(int));
        for (j = 0; j < col1; j++)
        {
            fscanf(file, "%d", &mat1[i][j]);
        }
    }
    for (i = 0; i < row1; i++)
    {
        for (j = 0; j < col1; j++)
        {
            printf("%d\t", mat1[i][j]);
        }
        printf("\n");
    }
    fscanf(file, "%d %d", &row2, &col2);//row of second matrix

    mat2 = (int **)malloc(row2 * sizeof(int*));//create memory for second matrix
    //reading data for second matrix

    for (i = 0; i < row2; i++)
    {
        mat2[i] = malloc(col2 * sizeof(int));
        for (j = 0; j < col2; j++)
        {
            fscanf(file, "%d", &mat2[i][j]);
        }
    }
    for (i = 0; i < row2; i++) //check mat2
    {
        for (j = 0; j < col2; j++)
        {
            printf("%d\t", mat2[i][j]);
        }
        printf("\n");
    }
    fclose(file);
    return 0;
}