Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

writing bits into a c++ file

I'm working on Huffman coding and I have built the chars frequency table with a

std::map<char,int> frequencyTable;

Then I have built the Huffman tree and then i have built the codes table in this way:

std::map<char,std::vector<bool> > codes;

Now I would read the input file, character by character ,and encode them through the codes table but i don't know how write bits into a binary output file. Any advice?

UPDATE: Now i'm trying with these functions:

void Encoder::makeFile()
{
char c,ch;
unsigned char ch2;
while(inFile.get(c))
{
    ch=c;
    //send the Huffman string to output file bit by bit
    for(unsigned int i=0;i < codes[ch].size();++i)
    {
        if(codes[ch].at(i)==false){
            ch2=0;
        }else{
            ch2=1;
        }
        encode(ch2, outFile);
    }
}
ch2=2; // send EOF
encode(ch2, outFile);

inFile.close();
outFile.close();
}

and this:

void Encoder::encode(unsigned char i, std::ofstream & outFile)
{
int bit_pos=0; //0 to 7 (left to right) on the byte block
unsigned char c; //byte block to write

if(i<2) //if not EOF
{
    if(i==1)
        c |= (i<<(7-bit_pos)); //add a 1 to the byte
    else //i==0
        c=c & static_cast<unsigned char>(255-(1<<(7-bit_pos))); //add a 0
    ++bit_pos;
    bit_pos%=8;
    if(bit_pos==0)
    {
        outFile.put(c);
        c='\0';
    }
}
else
{
    outFile.put(c);
}
}

but ,I don't know why ,it doesn't work, the loop is never executed and the encode function is never used, why?

like image 905
Alfredo Liardo Avatar asked Sep 11 '25 21:09

Alfredo Liardo


1 Answers

You can't write a single bit directly to a file. The I/O unit of reading/writing is a byte (8-bits). So you need to pack your bools into chunks of 8 bits and then write the bytes. See Writing files in bit form to a file in C or How to write single bits to a file in C for example.

like image 74
Jean-Baptiste Yunès Avatar answered Sep 14 '25 13:09

Jean-Baptiste Yunès