У меня есть программа, которая создает дерево Хаффмана на основе частоты символов ASCII, считываемой в текстовом файле ввода.Коды Хаффмана хранятся в строковом массиве из 256 элементов, пустая строка, если символ не читается.Эта программа также кодирует и сжимает выходной файл.
Сейчас я пытаюсь распаковать и декодировать мой текущий выходной файл, который открывается как входной файл, и новый выходной файл должен иметь декодированное сообщение, идентичное оригинальному.файл текстового ввода.
Мой мыслительный процесс для этой части задания состоит в том, чтобы воссоздать дерево с кодами Хаффмана, а затем, читая 8 битов за раз, перемещаться по дереву, пока не достигну конечного узла, где у меня будетобновил пустую строку (строковый ответ) и затем вывел ее в мой выходной файл.
Моя проблема: После написания этой функции я вижу, что только один символ между всеми остальными символами моего исходного входного файла получает выводнесколько раз.Я не понимаю, почему это так, потому что я ожидаю, что выходной файл будет идентичен исходному входному файлу.
Любое руководство или решение этой проблемы приветствуется.
(Для функции encodedOutput fileName является параметром входного файла, fileName2 является параметром выходного файла)
(Для функции decodeOutput fileName2 является параметром входного файла, fileName 3 является параметром выходного файла)
код [256] является параметром для обеих этих функций и содержит код Хаффмана для каждого уникального символа, считываемого в исходном входном файле, например, символ «Н», читаемый во входном файле, может иметькод «111», хранящийся в массиве кодов для кода [72] во время его передачи функциям.
freq [256] содержит частоту чтения каждого символа ascii или 0, если онотсутствует в исходном входном файле.
void encodeOutput(const string & fileName, const string & fileName2, string code[256]) {
ifstream ifile;
ifile.open(fileName, ios::binary);
if (!ifile)
{
die("Can't read again");
}
ofstream ofile;
ofile.open(fileName2, ios::binary);
if (!ofile) {
die("Can't open encoding output file");
}
int read;
read = ifile.get();
char buffer = 0, bit_count = 0;
while (read != -1) {
for (unsigned b = 0; b < code[read].size(); b++) { // loop through bits (code[read] outputs huffman code)
buffer <<= 1;
buffer |= code[read][b] != '0';
bit_count++;
if (bit_count == 8) {
ofile << buffer;
buffer = 0;
bit_count = 0;
}
}
read = ifile.get();
}
if (bit_count != 0)
ofile << (buffer << (8 - bit_count));
ifile.close();
ofile.close();
}
// Work in progress
void decodeOutput(const string & fileName2, const string & fileName3, string code[256], const unsigned long long freq[256]) {
ifstream ifile;
ifile.open(fileName2, ios::binary);
if (!ifile)
{
die("Can't read again");
}
ofstream ofile;
ofile.open(fileName3, ios::binary);
if (!ofile) {
die("Can't open encoding output file");
}
priority_queue < node > q;
for (unsigned i = 0; i < 256; i++) {
if (freq[i] == 0) {
code[i] = "";
}
}
for (unsigned i = 0; i < 256; i++)
if (freq[i])
q.push(node(unsigned(i), freq[i]));
if (q.size() < 1) {
die("no data");
}
while (q.size() > 1) {
node *child0 = new node(q.top());
q.pop();
node *child1 = new node(q.top());
q.pop();
q.push(node(child0, child1));
} // created the tree
string answer = "";
const node * temp = &q.top(); // root
for (int c; (c = ifile.get()) != EOF;) {
for (unsigned p = 8; p--;) { //reading 8 bits at a time
if ((c >> p & 1) == '0') { // if bit is a 0
temp = temp->child0; // go left
}
else { // if bit is a 1
temp = temp->child1; // go right
}
if (temp->child0 == NULL && temp->child1 == NULL) // leaf node
{
ans += temp->value;
temp = &q.top();
}
ofile << ans;
}
}
}