Задать вопрос
deadrime
@deadrime
Fullstack web developer

Как организовать побитовую запись?

Пытаюсь реализовать алгоритм Хаффмана, который будет сжимать текстовый файл. Уже построено дерево tree, у которого есть:
tree->simvol // char в котором хранится сам символ (например 'a')
tree->code // string, двоичный код для этого символа (например 1001)

Мне нужно написать функцию, которая пройдется по исходному файлу, и будет считывать каждый символ, сверяя его с символами в моем дереве, а найдя нужный - запишет в новый файл последовательность единиц и нулей(tree->code).

Трудность именно в побитовой записи, т.к я не совсем представляю, как ее организовать. Поясню - мне нужно, чтобы ,например, последовательность 10011110 занимала именно 8 бит, т.е единица или ноль занимали бы 1 бит, иначе сжатия не получится(если я просто вместо буквы "а" запишу "1001" как набор символов, а не битов).

void shifr(){
	ifstream myfile("file.txt");//открыли файл
	char ch;
	if (!myfile.is_open()) // если файл не открыт
     	   cout << "Файл не может быть открыт!\n"; // сообщить об этом
	else
	{
		while (myfile.get(ch))//проходимся посимвольно по всему текстовому файлу
		{
		find_char(ch);//находим нужный символ в дереве и записываем код этого символа в новый файл
		}	
		myfile.close();
	}
}

void find_char(spisok *&tree, char ch) {//рекурсивный обход дерева и поиск в нем символа
	if (tree->left==NULL && tree->right==NULL && tree->simvol==ch) {
		//???
		//вот тут нужно как-то записать код из tree->code в новый файл...
		//???
	}
	if (tree->left!=NULL) {
		find_char(tree->left,ch);
	}
	if (tree->right!=NULL) {
		find_char(tree->right,ch); 
	}
}
  • Вопрос задан
  • 6101 просмотр
Подписаться 5 Оценить Комментировать
Ответ пользователя mikhail_404 К ответам на вопрос (4)
@mikhail_404
И никогда не используйте
std::vector <bool>
alenacpp.blogspot.ru/2005/06/vector.html
Совет #18 (Мейерс)!
Можно, например, в инте все хранить или, на крайний случай, std::bitset.
Ответ написан