Показать сообщение отдельно

  #1827  
Старый 12.11.2008, 13:16
groupby
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме:
127017

Репутация: 61
По умолчанию

Цитата:
Сообщение от 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.
 
Ответить с цитированием