Чтение файла целиком в память - 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;
}

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

  1. Подключение необходимых библиотек для работы с файлами и памятью
  2. Проверка наличия файла, передаваемого в качестве аргумента командной строки
  3. Открытие файла в бинарном режиме
  4. Проверка успешного открытия файла
  5. Переход к последнему байту файла
  6. Определение размера файла в байтах
  7. Возврат файла в начало (смещение 0)
  8. Выделение памяти под буфер для чтения файла
  9. Проверка успешного выделения памяти
  10. Чтение файла в буфер
  11. Проверка количества прочитанных байт на соответствие размеру файла
  12. Вывод сообщения об успешном чтении файла
  13. Освобождение памяти, выделенной под буфер
  14. Закрытие файла
  15. Вывод сообщения о завершении работы программы

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


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

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

9   голосов , оценка 3.778 из 5