Чтение текстового файла без ограничения на размер - C (СИ)

Узнай цену своей работы

Формулировка задачи:

есть функция, которая осуществляет открытие и чтение текстового файла. функция возвращает содержимое этого файла. если файл не найден, функция возвращает NULL. как можно избавиться от цикла при чтении, и вообще убрать ограничение на размер файла?
char *grabfile(char *buf)
{
    char tfromfile[1024];
    int fd = open("index.html", O_RDONLY);
    if (fd != -1) {
        read(fd, tfromfile, sizeof(tfromfile));
            return tfromfile;
        }
        return NULL;
}
(в дальнейшем, уже в другой функции, содержимое файла будет выводиться принтф'ом в консоль и записываться в сокет)

Решение задачи: «Чтение текстового файла без ограничения на размер»

textual
Листинг программы
char *open_and_read_file( char *file_name ){
    FILE *file;
    if ( (file = fopen(file_name, "rb")) == NULL ){
        perror("Error opening file");
        exit(1);
    }
 
    fseek(file, 0, SEEK_END);
    long int size_file = ftell(file);
    rewind(file);
 
    char *data;
    if ( (data = (char*)malloc(size_file)) == NULL ){
        perror("Memory error");
        exit(2);
    }
 
    if ( fread(data, sizeof(*data), size_file / sizeof(*data), file) != size_file / sizeof(*data) ){
        perror("Reading error");
        exit(3);
    }
 
    fclose(file);
 
    return data;
}

Объяснение кода листинга программы

  1. Функция open_and_read_file принимает на вход строку file_name, которая содержит имя файла для чтения.
  2. В первой строке кода функция пытается открыть файл с помощью функции fopen. Если файл не может быть открыт, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 1.
  3. В третьей строке кода функция использует fseek для перехода в конец файла, чтобы определить его размер.
  4. В четвертой строке кода функция определяет переменную size_file, которая содержит размер файла.
  5. В пятой строке кода функция использует rewind для возврата в начало файла.
  6. В шестой строке кода функция выделяет память для хранения данных из файла с помощью malloc. Если память не может быть выделена, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 2.
  7. В седьмой строке кода функция читает данные из файла с помощью fread. Если чтение не удалось, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 3.
  8. В восьмой строке кода функция закрывает файл с помощью fclose.
  9. В девятой строке кода функция возвращает указатель на данные из файла.
  10. Код не содержит обработки ошибок, связанных с чтением файла. Если чтение файла не удалось, программа завершится с кодом ошибки 3.
  11. Код не содержит обработки ошибок, связанных с выделением памяти. Если выделение памяти не удалось, программа завершится с кодом ошибки 2.
  12. Код не содержит обработки ошибок, связанных с открытием файла. Если файл не может быть открыт, программа завершится с кодом ошибки 1.
  13. Функция не проверяет, достаточно ли памяти было выделено для хранения данных из файла. Если файл больше, чем доступная память, программа завершится с ошибкой сегментации.
  14. Функция не проверяет, достигнут ли конец файла при чтении. Если файл больше, чем предполагалось, программа завершится с ошибкой сегментации.
  15. Функция не содержит обработки ошибок, связанных с использованием функции perror. Если произойдет ошибка, программа завершится с кодом ошибки 1.
  16. Функция не содержит обработки ошибок, связанных с использованием функции malloc. Если выделение памяти не удалось, программа завершится с кодом ошибки 2.
  17. Функция не содержит обработки ошибок, связанных с использованием функции fclose. Если функция fclose завершится с ошибкой, программа завершится с кодом ошибки 1.
  18. Функция не содержит обработки ошибок, связанных с использованием функции fread. Если чтение файла не удалось, программа завершится с кодом ошибки 3.
  19. Функция не содержит обработки ошибок, связанных с использованием функции fopen. Если файл не может быть открыт, программа завершится с кодом ошибки 1.
  20. Функция не содержит обработки ошибок, связанных с использованием функции ftell. Если функция ftell завершится с ошибкой, программа завершится с кодом ошибки 1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы