Как я могу выделить достаточно памяти для хранения всего текстового файла в C? - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь сохранить весь текст из текстового файла в переменной. Вот код, который делает это:

        FILE *logData_fp;
        logData_fp = fopen("log", "r");
        fseek(logData_fp, 0, SEEK_END);
        int logData_len = ftell(logData_fp);

        char *logData = malloc(logData_len*sizeof(char) + sizeof(char));
        fgets(logData, logData_len, logData_fp);
        logData[strlen(logData)] = '\0';

        fclose(logData_fp);

        printf("Log data length: %d\nLog data:\n%s\n", strlen(logData), logData);

Вся программа компилируется без ошибок или предупреждений.

В текстовом файле содержится несколько сотен символов, но значение strlen () 3. Это также не распечатывает правильно и просто имеет странный символ в конце.

Где я все испортил?

1 Ответ

2 голосов
/ 08 января 2020

Вы стремитесь к концу, чтобы получить размер файла, но не пытаетесь вернуться к началу до чтения. Добавьте эту строку после вызова ftell.

fseek(logData_fp, 0, SEEK_SET);

fgets может не прочитать весь файл. Возможно, вы хотите вместо fread?

Кроме того, назначение logData[strlen(logData)] = '\0'; не будет выполнять то, что вы думаете. strlen ищет нулевой байт в качестве ограничителя строки, что может привести к записи за конец массива, если этот байт не найден (и если он есть, вам не нужно помещать его туда). fgets может поместить туда нулевой байт; fread не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...