Массив указателей на строку при чтении файла в C - PullRequest
0 голосов
/ 02 мая 2020

Я хочу прочитать файл и сохранить каждую строку в массиве указателей. Файл имеет 4 строки и каждая строка имеет 4 символа. Я читаю каждую строку с помощью fgets и назначаю строку для моего массива указателей. При назначении я могу написать строку правильно, но после l oop (для чтения файла) результат не верный. NUM_VOWELS равно 4, MAX_SIZE равно 20, и они определены как макросы

Мой главный код:

int main(void)
{
    FILE *file_vowels;
    int i, line_count = 0;
    char *vowels[NUM_VOWELS]; // my array of pointer
    char line[MAX_SIZE], *status;

    file_vowels = fopen(FILE_VOWELS, "r");
    for(
        status = fgets(line, MAX_SIZE, file_vowels);
        status != NULL;
        status = fgets(line, MAX_SIZE, file_vowels)
        )
    {
        if(line[strlen(line) -1] == '\n')
            line[strlen(line) -1] = '\0';

        vowels[line_count] = line;
        printf("vowels[%d] : %s\n", line_count, vowels[line_count]);
        line_count++;

    }
    printf("=====================\n");

    for(i = 0; i < NUM_VOWELS; ++i)
        printf("vowels[%d] : %s\n", i, vowels[i]);

    return 0;
}

Вот результат:

введите описание изображения здесь

Вот пример файла:

введите описание изображения здесь

1 Ответ

1 голос
/ 02 мая 2020
vowels[line_count] = line;

Существует только один массив line, и вы присваиваете его адрес vowels[line_count]. В результате каждый vowels[i] указывает line, который содержит последнюю прочитанную строку файла. Попробуйте

vowels[line_count] = strdup(line);

Не забудьте free(vowels[i]) позже.

Другое решение

char vowels[NUM_VOWELS][MAX_SIZE];
...
strcpy(vowels[line_count], line);
...