Можно ли взять токен из файла и создать с ним структуру, используя mallo c in C? - PullRequest
0 голосов
/ 24 апреля 2020

Мне нужно использовать оба malloc и realloc, и я не совсем понимаю, как это сделать.

Предполагая, что входной файл выглядит примерно так:

a *b c
a
*a b *c

и я есть структуры, настроенные так:

typedef struct Unit {
    bool hasAstericks;
    char letter;
} unit;

typedef struct Line {
    struct unit clause[4]
} line;

Можно ли создать структуру типа unit из каждой буквы, добавить их в массив в структуре Line на основе строки, на которой они находятся? Я пытался использовать петли, но не мог создавать структуры на лету с ними.

Это то, что я пробовал:

int c;
filename = argv[1];
char *filename;
FILE *fp = fopen(filename, "r");  
filename = (char *)malloc(size);

do {
    c = fgetc(fp);
    inputFile = (char *)realloc(inputFile, size + 1);
    inputFile[n] = c;
    n++;
    size++;
} while (c != EOF);

1 Ответ

2 голосов
/ 24 апреля 2020

Ваш do / while l oop пытается прочитать файл в массив char, который вы перераспределяете для каждого дополнительного байта, считанного из файла.

Однако вам следует проверить конец файла до сохранения байта в массиве.

Также может быть лучше установить нулевой терминатор в конце массива, когда вы закончите, поэтому массив должен иметь size + 1 байт.

Здесь вы изменили код и инкапсулировали в функцию для чтения файла:

char *read_file(const char *filename) {
    FILE *fp = fopen(filename, "r");  
    if (fp == NULL)
        return NULL;
    size_t size = 0;
    char *p = malloc(size + 1);
    if (p != NULL) {
        int c;
        while ((c = getc(fp)) != EOF) {   
            char *newp = realloc(p, size + 2);
            if (newp == NULL) {
                free(p);
                p = NULL;
                break;
            }
            p = newp;
            p[size] = c;
            size++;
        }
        if (p) {
            p[size] = '\0';  set a null terminator: make p a C string.
        }
    }
    fclose(fp);
    return p;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...