Можно ли загрузить матрицу и ее размер из файла? - PullRequest
0 голосов
/ 14 января 2020

По сути, входной файл должен выглядеть следующим образом:

4
1 2 3 4
2 1 4 3
4 3 2 1
3 4 1 2

Где первая строка - размер квадратной матрицы. Однако я не могу правильно загрузить входные данные непосредственно в n, а затем в матрицу. Я избежал такой проблемы, создав массив «загрузчик».

int n, loader[100], p=0;
while(feof(data) == 0) {
    if(p == 0) {
        fscanf(data, "%d", &n); //taking n
        p++;
    } else {
        fscanf(data, "%d", &loader[p]); //taking matrix values for p>0
        p++;
    }
}

//loading the matrix
int mat[n][n], o = 1; //o is set to 1, as the loader
                      //has been loaded from position 1.
for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++){
        printf("%d\n", loader[o]);
        mat[i][j] = loader[o];
        o++;
    }
}

Однако я думаю, что это просто не нужно, и может быть более быстрый способ непосредственного определения размера матрицы и ее значений. Когда я программировал таким образом, я получил приветственную ошибку Segmentation Fault.

1 Ответ

2 голосов
/ 14 января 2020

Этот код работает:

int loadMatrix(char *pth)
{
    int i, j, n, **mat, p = 0, num;
    FILE *fd;

    fd = fopen(pth, "r");
    if(fd == NULL) return(-1);

    /* Read matrix size */
    if(fscanf(fd, "%d", &n) == EOF) return(-1);
    printf("Size: %d\n", n);

    mat = malloc(n * sizeof(int *));
    for(i = 0; i < n; i++) mat[i] = malloc(sizeof(int) * n);

    while(fscanf(fd, "%d", &num) != EOF && p < (n * n)) {
        mat[p / n][p % n] = num;
        p++;
    }

    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }

    for(i = 0; i < n; i++) free(mat[i]);
    free(mat);

    fclose(fd);
    return(0);
}
...