I have created a bitset using std::bitset<8> bits
which is equivalent to 00000000
i.e., 1 byte.
I have output file defined as std::ofstream outfile("./compressed", std::ofstream::out | std::ofstream::binary)
but when I write the bits
using outfile << bits
, the content of outfile
becomes 00000000
but the size of file is 8 bytes. (each bit of bits
end up taking 1 byte in the file). Is there any way to truly write byte to a file? For example if I write 11010001
then this should be written as a byte and the file size should be 1 byte not 8 bytes. I am writing a code for Huffman encoder and I am not able to find a way to write the encoded bytes to the output compressed file.
The issue is operator<<
is the text encoding method, even if you've specified std::ofstream::binary
. You can use put
to write a single binary character or write
to output multiple characters. Note that you are responsible for the conversion of data to its char
representation.
std::bitset<8> bits = foo();
std::ofstream outfile("compressed", std::ofstream::out | std::ofstream::binary);
// In reality, your conversion code is probably more complicated than this
char repr = bits.to_ulong();
// Use scoped sentries to output with put/write
{
std::ofstream::sentry sentry(outfile);
if (sentry)
{
outfile.put(repr); // <- Option 1
outfile.write(&repr, sizeof repr); // <- Option 2
}
}