Вы не можете писать в двоичный файл только с битами; наименьший размер записанных данных - один байт (таким образом, 8 бит).
Так что вам нужно создать буфер (любой размер).
char BitBuffer;
Запись в буфер:
int Location;
bool Value;
if (Value)
BitBuffer |= (1 << Location);
else
BitBuffer &= ~(1 << Location)
Код (1 << Location)
генерирует номер со всеми 0, за исключением позиции, заданной Location
. Затем, если для параметра Value
установлено значение true, он устанавливает соответствующий бит в буфере 1 и 0 в другом случае. Используемые двоичные операции довольно просты, если вы их не понимаете, это должно быть в любой хорошей книге/учебнике на C++.
Местоположение должно быть в диапазоне < 0, sizeof (Buffer) -1>, поэтому < 0,7> в этом случае.
Запись буфера в файл относительно проста при использовании fstream. Просто не забудьте открыть его как двоичный.
ofstream File;
File.open("file.txt", ios::out | ios::binary);
File.write(BitBuffer, sizeof(char))
EDIT: обнаружена ошибка и исправлена.
EDIT2: Вы не можете использовать операторы <<
в двоичном режиме, я забыл об этом.
Альтернативное решение: Используйте std::vector<bool>
или std::bitset
в качестве буфера.
Это должно быть еще проще, но я думал, что смогу помочь вам немного больше.
void WriteData (std::vector<bool> const& data, std::ofstream& str)
{
char Buffer;
for (unsigned int i = 0; i < data.size(); ++i)
{
if (i % 8 == 0 && i != 0)
str.write(Buffer, 1);
else
// Paste buffer setting code here
// Location = i/8;
// Value = data[i];
}
// It might happen that data.size() % 8 != 0. You should fill the buffer
// with trailing zeros and write it individually.
}
Просто, чтобы сделать вещи ясно. , что я имею в виду двоичной эквивалентной строки заключается в следующем: , например, если А закодированный 010 я хочу написать 010 на файл в виде двоичного 0 и двоичном один так общая сумма составляет 3 бит НЕ 24 бит (3 байт), каждый из которых имеет двоичный эквивалент ASCII для символа 0 и символ 1. – HSN
Мы не понимаем, что у вас есть, а не то, что вам нужно в конце. – akappa
У меня есть структура данных (определяется пользователем), которая содержит 3 поля; символа, частоты и эквивалентного битового кодирования. сейчас, сначала я собираюсь прочитать текст из текстового файла и заполнить частотное поле для каждого символа, преобразовать структуру данных в двоичное дерево, а затем пройти дерево, чтобы найти эквивалентную битовую кодировку для каждого символа. Наконец (это мой вопрос): я хочу создать сжатую версию исходного текстового файла, прочитав каждый символ из исходного текста и напиши его эквивалентную битовую строку (используя двоичное дерево) в двоичном файле. – HSN