Вычисление общего количества элементов в матрице, записанной в файле - PullRequest
0 голосов
/ 07 декабря 2018

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

    int i, j;
FILE *file_ptr;
file_ptr= fopen( "matrice.txt" , "r");
if(file_ptr==NULL) {
    printf("errore nome programma");
    return 1;
}

int N;
fseek(file_ptr, 0L, SEEK_END); 

N = (ftell(file_ptr))/16;   
fseek(file_ptr, 0, SEEK_SET);
if( N < 4){
    printf("matrice di dimensioni inferiore a 4");
    return 1;
}

int **file_matrix = (int**)calloc( N , sizeof(file_matrix));
for(i = 0 ; i < N ; i ++){
    file_matrix[i]= (int*) calloc( N , sizeof(file_matrix));
    }

for(i = 0 ; i < N ; i++){

    for(j = 0 ; j < N ; j++){
        if(!fscanf(file_ptr , "%d" , &file_matrix[i][j])) break;

    }

Проблема, которую я получил, состоит в том, что если я пишу матрицу 7x7, она правильно печатается, если я изменяю ее и пишу 4x4, она печатает гораздо больше элементов, которые являются нулями, потому что я выделил с помощьюcalloc.Лучше: без if (n <4) печатать нули;с его помощью программа печатает ошибку, записанную в if </p>

1 0 4 0 4
2 3 4 9 4
1 3 4 5 4
0 0 1 0 4
1 2 3 4 5

1 Ответ

0 голосов
/ 07 декабря 2018

Найти значение N только чтение первой строки:

int N = 0;
char* line = NULL;
ssize_t read, len;

if ((read = getline(&line, &len, file_ptr)) != -1) {
    char *n = strtok(line, " ");
    do { 
        N++;
    } while ((n = strtok(NULL, " ")) != NULL);
    free(line);
    line = NULL;
}
fseek(file_ptr, 0, SEEK_SET);

Поскольку функция ftell возвращает только длину файла в байтах, ее нельзя использовать для получения числа целых чисел, поскольку вномера ваших файлов ASCII разделены пробелом " ".Поэтому после извлечения первой строки файла вы можете токенизировать ее с помощью strtok, разделяя ее пробелом и беря в ней число целых чисел:

char *n = strtok(line, " ");
do { 
    N++;
} while ((n = strtok(NULL, " ")) != NULL);

Также не забывайте #include <string.h> для функции strtok.

Обратите внимание также на calloc размеры:

int **file_matrix = (int**)calloc( N , sizeof(file_matrix));
file_matrix[i] = (int*) calloc( N , sizeof(file_matrix));

должно быть

int **file_matrix = (int**) calloc( N , sizeof(int*));
file_matrix[i] = (int*) calloc( N , sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...