Сообщение от
Lee_fx
Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
Вы не понимаете саму суть битов. Бит - 1/8 часть байта, которая может быть либо 0 либо 1. Отдельный бит записать в файл нельзя. Записать его можно только в виде байта. Соответственно перед записью битов необходимо их паковать в байты, и при накоплении количества битов кратному 8ми, записывать их в выходной файл. Вот накатал небольшое решение для вашего вопроса:
Код:
#include <stdio.h>
void main()
{
FILE *in, *out;
//кодирование 3мя битами
int ar[3] = {0x00, 0x05, 0x07}; //коды 'a', 'b', 'c'
char buf; //тут сидит считанный байт с файла
in = fopen("f1.txt", "rb");
out = fopen("f2.bin", "wb");
int count = 0;
union {
int out_buf;
char b[4];
} data;
data.out_buf = 0;
while(fread(&buf, 1, 1, in))
{
if(count < 8)
{ //не записываем, пока не наберем кратное 8ми
//количество битов
data.out_buf = (data.out_buf<<3) + ar[buf - 'a'];
count++;
}
else
{ //запись битов
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
data.out_buf = ar[buf - 'a'];
count = 1;
}
}
if(count > 0)
{ //запись остатков
fwrite(&data.b[2], 1, 1, out);
fwrite(&data.b[1], 1, 1, out);
fwrite(&data.b[0], 1, 1, out);
}
fclose(out);
fclose(in);
}
Вот пример файла для кодирования (f1.txt) 22 байта:
Код:
bacbabcabcbacbabcbacba
После ужатия получили 12 байт, но в конце есть лишние байты, т.к. количество битов не кратно 8ми (22*3 = 66), соответственно в начале файла нужно хранить ещё выходной размер файла, чтобы опустить лишнюю информацию в конце файла, но это уже за рамками поста (пиши в ПМ, если что).
Следует учитывать, что по Хаффману для каждого символа должен быть свой код, т.е. во входном файле все возможные символы должны быть предугаданы тобой, то бишь быть в массиве ar.