Чтение текстового файла без ограничения на размер - 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; }
Объяснение кода листинга программы
- Функция
open_and_read_file
принимает на вход строкуfile_name
, которая содержит имя файла для чтения. - В первой строке кода функция пытается открыть файл с помощью функции
fopen
. Если файл не может быть открыт, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 1. - В третьей строке кода функция использует
fseek
для перехода в конец файла, чтобы определить его размер. - В четвертой строке кода функция определяет переменную
size_file
, которая содержит размер файла. - В пятой строке кода функция использует
rewind
для возврата в начало файла. - В шестой строке кода функция выделяет память для хранения данных из файла с помощью
malloc
. Если память не может быть выделена, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 2. - В седьмой строке кода функция читает данные из файла с помощью
fread
. Если чтение не удалось, функция выводит сообщение об ошибке и завершает свое выполнение с кодом ошибки 3. - В восьмой строке кода функция закрывает файл с помощью
fclose
. - В девятой строке кода функция возвращает указатель на данные из файла.
- Код не содержит обработки ошибок, связанных с чтением файла. Если чтение файла не удалось, программа завершится с кодом ошибки 3.
- Код не содержит обработки ошибок, связанных с выделением памяти. Если выделение памяти не удалось, программа завершится с кодом ошибки 2.
- Код не содержит обработки ошибок, связанных с открытием файла. Если файл не может быть открыт, программа завершится с кодом ошибки 1.
- Функция не проверяет, достаточно ли памяти было выделено для хранения данных из файла. Если файл больше, чем доступная память, программа завершится с ошибкой сегментации.
- Функция не проверяет, достигнут ли конец файла при чтении. Если файл больше, чем предполагалось, программа завершится с ошибкой сегментации.
- Функция не содержит обработки ошибок, связанных с использованием функции
perror
. Если произойдет ошибка, программа завершится с кодом ошибки 1. - Функция не содержит обработки ошибок, связанных с использованием функции
malloc
. Если выделение памяти не удалось, программа завершится с кодом ошибки 2. - Функция не содержит обработки ошибок, связанных с использованием функции
fclose
. Если функцияfclose
завершится с ошибкой, программа завершится с кодом ошибки 1. - Функция не содержит обработки ошибок, связанных с использованием функции
fread
. Если чтение файла не удалось, программа завершится с кодом ошибки 3. - Функция не содержит обработки ошибок, связанных с использованием функции
fopen
. Если файл не может быть открыт, программа завершится с кодом ошибки 1. - Функция не содержит обработки ошибок, связанных с использованием функции
ftell
. Если функцияftell
завершится с ошибкой, программа завершится с кодом ошибки 1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д