SuperXero
SuperXero

Reputation: 43

Writing chars as a byte in C++

I'm writing a Huffman encoding program in C++, and am using this website as a reference:

http://algs4.cs.princeton.edu/55compression/Huffman.java.html

I'm now at the writeTrie method, and here is my version:

// write bitstring-encoded tree to standard output
void writeTree(struct node *tempnode){
if(isLeaf(*tempnode)){
    tempfile << "1";
    fprintf(stderr, "writing 1 to file\n");
    tempfile << tempnode->ch;
    //tempfile.write(&tempnode->ch,1);
    return;
}
else{
    tempfile << "0";
    fprintf(stderr, "writing 0 to file\n");
    writeTree(tempnode->left);
    writeTree(tempnode->right);
}   
}

Look at the line commented - let's say I'm writing to a text file, but I want to write the bytes that make up the char at tempnode->ch (which is an unsigned char, btw). Any suggestions for how to go about doing this? The line commented gives an invalid conversion error from unsigned char* to const char*.

Thanks in advance!

EDIT: To clarify: For instance, I'd like my final text file to be in binary -- 1's and 0's only. If you look at the header of the link I provided, they give an example of "ABRACADABRA!" and the resulting compression. I'd like to take the char (such as in the example above 'A'), use it's unsigned int number (A='65'), and write 65 in binary, as a byte.

Upvotes: 0

Views: 1358

Answers (1)

Potatoswatter
Potatoswatter

Reputation: 137810

A char is identical to a byte. The preceding line tempfile << tempnode->ch; already does exactly what you seem to want.

There is no overload of write for unsigned char, but if you want, you can do

tempfile.write(reinterpret_cast< char * >( &tempnode->ch ),1);

This is rather ugly, but it does exactly the same thing as tempfile << tempnode->ch.

EDIT: Oh, you want to write a sequence of 1 and 0 characters for the bits in the byte. C++ has an obscure trick for that:

#include <bitset>

tempfile << std::bitset< 8 >( tempnode->ch );

Upvotes: 3

Related Questions