Печать матрицы из текстового файла в C - PullRequest
0 голосов
/ 24 февраля 2019

Я должен прочитать количество строк и столбцов матрицы из текстового файла, а также его элементов.первая строка - это число строк и столбцов, за которыми следуют их номера.Например, это матрица с 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

Вот часть кода.Заранее спасибо.

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=malloc(row1 * col1 * sizeof(int*));//create memory for first matrix
//reading data for first matrix
for(i=0; i<row1; i++)
{
    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=malloc(row2 * col2 * sizeof(int*));//create memory for second matrix
//reading data for second matrix

for(i=0; i<row2; i++)
{
    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");

}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

У вас есть проблема с выделением 2D-массивов:

Например:

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

это должно быть

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

Затем следует выделить каждую строку в mat1 цикл for с перед 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;
}
0 голосов
/ 24 февраля 2019

Я думаю, что я исправил проблему, но мне пришлось сделать немало отладки из-за большого количества ошибок, поэтому я поставлю ответ на исходный вопрос сверху и отложу все вещи, которые мне пришлось отлаживатьвнизу.

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я не представлял число вложенных элементов, которые были проиндексированы, мне пришлось изменить объявление матриц, способ их заполнения и способ их ссылки.

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");
}

Имейте в виду, что если вы собираетесь ссылаться на массив внутри массива, тогда вам нужно выделять место для другого массива в каждом слоте исходного массива.Я выбрал неинтуитивный подход к матричной арифметике, но код можно дополнить, чтобы можно было легко использовать индексацию по двум массивам.

...