Прочитать файл как массив байтов

У меня есть задание по кодированию алгоритма Хаффмана. У меня вся проблема организована в голове, но у меня проблемы с обработкой файлов.

Проблема в том, что алгоритм должен сжимать файлы ЛЮБОГО типа.

Мое решение: прочитать файл как массив байтов, затем с int array[256]={0} для каждого байта получить соответствующее значение int n и увеличить array[n]. Если я не ясно выразился, дайте мне знать.

Итак, я провел много исследований, но не понимаю, как получить байты из ЛЮБОГО файла и как с ними обращаться.


person alissonlacerda    schedule 27.02.2014    source источник
comment
Я видел много тем на эту тему, но ни одна из них не была мне понятна. Я вам так говорю, пожалуйста ссылку один здесь. Спасибо :)   -  person alissonlacerda    schedule 27.02.2014
comment
Я вижу пару проблем... сначала я бы загрузил ваш файл в char array[]. Что плохого в простом fopen()/fread(), препятствующем открытию любого файла? Наконец, пожалуйста, попробуйте и сообщите, что с ним не так.   -  person Sigi    schedule 27.02.2014
comment
Вопрос отредактирован. Убрано предложение с просьбой порекомендовать какой-то сторонний ресурс.   -  person alissonlacerda    schedule 27.02.2014
comment
Проблема решена. Спасибо пользователю 1274193. Теперь я могу открыть любой файл и сохранить его байты в массиве.   -  person alissonlacerda    schedule 27.02.2014


Ответы (2)


FILE *fileptr;
char *buffer;
long filelen;

fileptr = fopen("myfile.txt", "rb");  // Open the file in binary mode
fseek(fileptr, 0, SEEK_END);          // Jump to the end of the file
filelen = ftell(fileptr);             // Get the current byte offset in the file
rewind(fileptr);                      // Jump back to the beginning of the file

buffer = (char *)malloc(filelen * sizeof(char)); // Enough memory for the file
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file

Теперь у вас есть массив байтов, содержащий содержимое файла.

person user1274193    schedule 27.02.2014
comment
Большое спасибо! Я приближаюсь к тому, чего хочу. Я буду учиться дальше и делать некоторые тесты. - person alissonlacerda; 27.02.2014
comment
разве вы не должны вызывать buffer[filelen] = '\0'; после закрытия? - person mexok; 01.02.2015
comment
Это дает мне ошибку сегментации в fseek() - person Singh; 12.10.2015
comment
@Commander3000 Commander3000 Если весь массив следует рассматривать как строку, то завершение NULL имеет смысл, но ОП спрашивал о чтении в двоичном файле, то есть в ЛЮБОМ файле. - person Harry; 19.02.2016
comment
Я только что заметил, что приведенный выше ответ также предполагает завершение NULL путем добавления дополнительного байта в вызов malloc, чего не должно быть. Если двоичный файл имеет N байтов, ему не нужно (N + 1) байтов для буфера. - person Harry; 19.02.2016
comment
В нем нет обработки ошибок, он не проверяет, прочитан ли весь файл. И почему тип буфера char? - person Aleksandr Dubinsky; 13.07.2021

Как насчет того, чтобы попробовать двоичный файл ввода-вывода:

  FILE *f=fopen("example.bin","rb");
  char c;
  //loop for each byte to the end
  {
    size_t fread(&c, (size_t)1, (size_t) 1, f);
    array[c]++;
  }

Или что-то в этом роде!!

person Suryavanshi    schedule 27.02.2014