Чтение текстового файла без ограничения на размер - 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.