функция readlines для вставки текста строка за строкой из файла в массив строк, передаваемый указателем - PullRequest
2 голосов
/ 03 июня 2019

Я пытаюсь создать функцию read_lines, которая принимает файл * fp, указатель на строки char ** и указатель на int num_lines. Функция должна вставлять каждую строку текста в строки и увеличивать num_lines на столько строк, сколько имеется в файле.

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

Вот как будет выглядеть main.c. Все, кроме read_lines, уже определено и работает. Файл может содержать любое количество строк, вкладок и даже может быть только символом новой строки.

(это задание домашней работы, поэтому main.c и объявление функции должны оставаться неизменными)

int main(int argc, char* argv[]){

    char** lines = NULL;
    int num_lines = 0;
    FILE* fp = validate_input(argc, argv);
    read_lines(fp, &lines, &num_lines);
    print_lines(lines, num_lines);
    free_lines(lines, num_lines);
    fclose(fp);

    return 0;
}

Это одна из моих попыток добавить строки, но я не смог понять.

read_lines.c

void read_lines(FILE *fp, char ***lines, int *num_lines) {
    int i;
    int N = 0;
    char s[200];
    for (i=0; i<3; i++)
    {
        while(fgets(s, 200, fp)!=NULL){N++;}
        char strings[50][200];

        rewind(fp);
        fgets(s, 200, fp);
        strcpy(lines[i],s);
    }

}

Буду признателен за помощь в решении этой проблемы, спасибо.

1 Ответ

1 голос
/ 03 июня 2019

Вам необходимо динамически распределять память для каждой строки по мере их чтения.Это делается с помощью функций malloc и realloc .malloc для выделения памяти и realloc для изменения размера выделения.

Приведенный ниже код должен делать то, что вы хотите (я не тестировал его подробно), но исключает проверку ошибок, которая была бы хорошей практикой.

void read_lines (FILE *fp, char ***lines, int *num_lines) {
    // Initialize you number of lines variable
    *num_lines = 0;

    //Initialize the lines pointer
    // NO ERROR CHECKING DONE HERE
    *lines = malloc(sizeof(char*));

    // create a fixed size buffer for reading from file
    char s[200];

    // Read from the file using fgets
    while (fgets(s, 200, fp) != NULL) {
        // THIS CODE ASSUMES ALL LINES ARE LESS THAN 200 CHARACTERS
        // The memory to hold the line of text needs to be allocated
        int length = strlen(s);
        // Ensure there is space for the terminating null character
        (*lines)[*num_lines] = malloc(sizeof(char) * (length + 1));
        // The line needs to be copied from the buffer to the allocated memory
        strcpy((*lines)[*num_lines], s);

        // increment number of lines variable
        *num_lines++;

        // allocate space for another line in advance
        *lines = realloc(*lines, sizeof(char*) * ((*num_lines) + 1));
    }

    // There will be an extra line pointer allocated in the loop
    // Shrink the allocation to the appropriate size
    *lines = realloc(*lines, sizeof(char*) * (*num_lines));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...