I need to calculate the frequency of the Huffman tree from the “binary” as the only argument. I have a doubt that binaries are files containing only "0" and "1".
While the frequency is a repetition of the number of alphabets (for example, abbacdd here the frequency is a = 2, b = 2, c = 1, d = 2). And my structure should be like this:
struct Node { unsigned char symbol; /* the symbol or alphabets */ int freq; /* related frequency */ struct Node *left,*right; /* Left and right leafs */ };
But I don’t understand at all how I can get the character from the “.bin” file (which consists of only “0” and “1”)?
When I try to see the contents of the file, I get:
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ xxd -b out.bin 0000000: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000006: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 000000c: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000012: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000018: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 000001e: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000024: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 000002a: 00000000 00000000 00000000 00000000 00000000 00000000 ...... 0000030: 00000000 00000000 00000000 00000000 00000000 00000000 ...... .........//Here also there is similar kind of data ................ 00008ca: 00010011 00010011 00010011 00010011 00010011 00010011 ...... 00008d0: 00010011 00010011 00010011 00010011 00010011 00010011 ...... 00008d6: 00010011 00010011 00010011 00010011 00010011 00010011 .....
, , . . , HUffman, .
- .std::map.- :
std::map
#include <algorithm> #include <fstream> #include <map> #include <string> std::map <unsigned char, int> CreateFrequencyTable (const std::string &strFile) { std::map <unsigned char, int> char_freqs ; // character frequencies std::ifstream file (strFile) ; int next = 0 ; while ((next = file.get ()) != EOF) { unsigned char uc = static_cast <unsigned char> (next) ; std::map <unsigned char, int>::iterator iter ; iter = char_freqs.find (uc) ; // This character is in our map. if (iter != char_freqs.end ()) { iter->second += 1 ; } // This character is not in our map yet. else { char_freqs [uc] = 1 ; } } return char_freqs ; }
:
std::map <unsigned char, int> char_freqs = CreateFrequencyTable ("file") ;
std::map <unsigned char, int>::iterator iter = std::max_element ( char_freqs.begin (), char_freqs.end (), std::map <unsigned char, int>::value_comp ) ;
., - , .
, :
// Make sure to #include <iterator> std::ifstream file ("test.txt") ; std::istream_iterator <unsigned char> begin = file ; std::vector<unsigned char> vecBuffer (begin, std::istream_iterator <unsigned char> ()) ;
.
,unsigned char, , ?, 0 1, 0 1 .
unsigned char
00010011 - xxdxxd -b 0/1 .0 255,0123456789abcdef, ,.
xxd
xxd -b
, C/++,unsigned char,, , . .
, , ,256 (0,1,2... 255)., 256 ( Node), .