Сохранение чисел из файла в массив в C - PullRequest
0 голосов
/ 13 января 2019

В моем коде я открыл файл (успешно) и пытаюсь получить числа в массив, но он не работает (контрольный вывод неверен). Компилятор не показал мне никакой ошибки.

ссылка в текстовом файле: https://textuploader.com/1amip

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

int main(void) {

FILE *fr_koty;

int **array = NULL;

int x = 1;              /* Pocet radku */
int y = 1;              /* Pocet sloupcu */

char line[1024];
char *assistant_line;

int number;             /* Promena pro cislo*/

char *tab;


if((fr_koty = fopen("koty.txt", "r")) == NULL) {

    printf("Soubor se nepodarilo otevrit!");
    return 0;

}

while(fgets(line, 1023, fr_koty) != NULL) {

    array = (int **) realloc(array, x * sizeof(int *));

    array[x] = NULL;

    assistant_line = line;

    while(sscanf(assistant_line, "%d", &number) == 1) {

        array[x] = (int *) realloc(array[x], y * sizeof(int));

        array[x][y] = number;
        printf("%d  ", array[x][y]);

        if((tab = strchr(assistant_line, '\t')) != NULL) {

            assistant_line = tab + 1;
            y++;

        }
        else {

            break;

        }

    }

    putchar('\n');

    x++;

}

}

Вывод чисел является случайным. Я думаю, что причина плохой работы с памятью, но я не вижу проблемы.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Теперь я тоже это вижу. Спасибо!

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

int main(void) {

FILE *fr_koty;

int **array = NULL;

int x = 1;              /* Pocet radku */
int y;                  /* Pocet sloupcu */

char line[1024];
char *assistant_line;

int number;             /* Promena pro cislo*/

char *tab;


if((fr_koty = fopen("koty.txt", "r")) == NULL) {

    printf("Soubor se nepodarilo otevrit!");
    return 0;

}

while(fgets(line, 1023, fr_koty) != NULL) {

    y = 1;

    array = (int **) realloc(array, x * sizeof(int *));

    array[x-1] = NULL;
    assistant_line = line;

    while(sscanf(assistant_line, "%d", &number) == 1) {

        array[x-1] = (int *) realloc(array[x-1], y * sizeof(int));

        array[x-1][y-1] = number;
        printf("%d  ", array[x-1][y-1]);

        if((tab = strchr(assistant_line, '\t')) != NULL) {

            assistant_line = tab + 1;
            y++;

        }
        else {

            break;

        }

    }

    putchar('\n');

    x++;

}

}
0 голосов
/ 13 января 2019

Вы инициализируете x и y в 1, что нормально для realloc, но поскольку массивы C основаны на 0, вам нужно использовать x-1 и y-1 для доступа к элементам массива.

Или вы инициализируете их 0 и используете (x + 1) и (y + 1) в вызове realloc. Я бы предпочел этот путь.

...