Я работаю над программой сжатия текстового файла на C++ для класса. У меня все работает, кроме возможности выводить файл в двоичном режиме. Я использую:Binary Output C++
FILE* pFile;
pFile = fopen(c, "wb");
Для того, чтобы открыть файл для записи в двоичном режиме,
bool Buffer[8] = { 0, 0, 0,0, 0,0, 0,0 };
Im использованием буфера BOOLS (инициализируется все 0), чтобы сохранить 1 и 0 в хранить каждый байт данных, пока я не буду использовать fwrite.
vector<bool> temp2 = bitstring[temp];//bitstring refers to a vector in a map at key [temp]
for (vector<bool>::iterator v = temp2.begin(); v != temp2.end(); ++v)
{
if (j < 8)//To create an 8 bit/byte buffer
{
if (*v == 1)//Checks the vector at that position to know what the bit is.
Buffer[j] =1;//sets the array at 'j' to 1
else
Buffer[j] =0 ;//sets the array at 'j' to 0
j++;
}
else //once the Buffer hits 8 it will print the buffer to the file
{
fwrite(Buffer,1,sizeof(Buffer), pFile);
clearBuffer(Buffer);//Clears the buffer to restart the process.
j = 0;
}
}
(вектор итератора) происходит через вектор BOOLS, который назначается на определенный характер, по существу уникальный двоичную строку, которая представляет символ. Моя проблема заключается в том, что вместо вывода в виде двоичного кода в буфере его вывод по существу ASCII-символов в двоичном режиме, а не только цифры как двоичные. Который в конечном итоге делает файл WAY больше, чем он должен быть. Как я могу изменить буфер, чтобы только вывести бит. Мне сказали использовать побитовые операторы, но я не могу найти очень много документации по реализации этого в C++. Любая помощь приветствуется, и
'станд :: вектор 'не адресует последовательную последовательность бит. ['std :: bitset <>'] (http://en.cppreference.com/w/cpp/utility/bitset), но может быть непригоден для вашего варианта использования, поскольку он не поддерживает потоки битов переменной длины. –
Примечание: у вас есть логическая ошибка: используйте для: (...) {if (index == buffer_size {write_buffer(); index = 0;} insert_into_buffer();} write_buffer_if_index_is_not_zero; –
Примечание: std :: vector может быть неправильным выбором, в первую очередь. –