Чтение файла целиком в память - C (СИ)
Формулировка задачи:
Помогите пожалуйста дописать программу.
Задание:
Считать файл целиком в память. В результате должен получиться массив байтов по размеру и содержанию совпадающий с файлом. До free(p) ничего менять не надо вроде, только после нужно дописать, а вот что дописать я не знаю.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void kill(int i, char p[])
{
while(i>=1)
{
free(p[i]);
i--;
}
}
int main(int argc, char *argv[])
{
FILE *in;
char c, *q, *p;
p=NULL;
int i=0;
if (argc >= 1)
{
in=fopen(argv[1],"r");
if (in == NULL)
return 0;
while (1)
{
c=fgetc(in);
if (c==-1)
break;
q=(char *)malloc(i+1);
memcpy (q, p, i);
free(p);
*(p+i)=c;
printf("%c", *(p+i));
i++;
}
fclose(in);
printf("sizeof(p)=%d\n", sizeof(*p)*i);
kill(i, p);
}
return 0;
}Решение задачи: «Чтение файла целиком в память»
textual
Листинг программы
#include <cstdio>
#include <cstdlib>
#include <cstddef>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <file_name>\n", argv[0]);
return -1;
}
FILE *infile;
infile = fopen(argv[1], "rb");
if (infile == NULL) {
printf("%s does not exist.\n", argv[1]);
return -1;
}
fseek(infile, 0, SEEK_END);
size_t file_size = ftell(infile);
rewind(infile);
char *buffer = (char*)malloc(file_size * sizeof(char));
if (buffer == NULL) {
fclose(infile);
printf("Error allocating %d bytes.\n", file_size * sizeof(char));
return -1;
}
size_t bytes_read = fread(buffer, sizeof(char), file_size, infile);
if (bytes_read != file_size) {
printf("Have read only %d bytes of %d.\n", bytes_read, file_size);
free(buffer);
fclose(infile);
return -1;
}
printf("Read successfull. Read %d bytes.\n", bytes_read);
free(buffer);
fclose(infile);
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и памятью
- Проверка наличия файла, передаваемого в качестве аргумента командной строки
- Открытие файла в бинарном режиме
- Проверка успешного открытия файла
- Переход к последнему байту файла
- Определение размера файла в байтах
- Возврат файла в начало (смещение 0)
- Выделение памяти под буфер для чтения файла
- Проверка успешного выделения памяти
- Чтение файла в буфер
- Проверка количества прочитанных байт на соответствие размеру файла
- Вывод сообщения об успешном чтении файла
- Освобождение памяти, выделенной под буфер
- Закрытие файла
- Вывод сообщения о завершении работы программы