霍夫曼压缩:二进制编码转十进制输出异常问题求助
霍夫曼压缩:二进制编码输出异常排查与修复
问题分析
你的代码输出与预期不符的核心原因是错误使用整数类型存储二进制编码,同时存在多个语法和逻辑错误:
1. 八进制字面量自动转十进制
C++中以0开头的数字会被解析为八进制数:
0010是八进制,转十进制为80111是八进制,转十进制为71101无前置0,被解析为十进制1101
加上代码中输出时的空格分隔,最终写入文件的内容是8 7 1101,去掉空格后就变成了你看到的8731101。
2. 映射类型错误
你定义的unordered_map<string,int> codes完全错误:
- 键应该是
char(对应文本中的单个字符),而非string - 值应该是
string(存储二进制编码字符串,比如"0010"),而非int——整数无法保留前导0,也不能直接表示二进制串。
3. 其他语法/变量错误
unorderd_map拼写错误,正确应为unordered_mapmain中调用encodedhuff(code, filename)时,code变量未定义,实际应使用codes- 注释掉的
tree相关代码若未启用,printCodes调用会报错(当前问题与该逻辑无关)
修复方案
修改代码如下,核心是将编码映射改为char到string的类型,直接输出二进制字符串:
#include <fstream> #include <unordered_map> #include <string> #include <iostream> #include <cstdlib> // 修正参数类型:编码映射为char到string的映射 void encodedhuff(std::unordered_map<char, std::string>& encoding_scheme, const std::string& filename ){ std::ifstream file(filename); std::ofstream outfile; // 取消app模式,避免多次运行追加内容,直接覆盖生成新文件 outfile.open("pride.huff"); if (!file.is_open()){ std::cout << "unable to open the file.\n"; std::exit(1); } char ch; while(file.get(ch)){ auto got = encoding_scheme.find(ch); if (got != encoding_scheme.end()){ // 直接输出二进制字符串,去掉分隔空格 outfile << got->second; } } file.close(); outfile.close(); } int main(){ // 修正映射类型:用字符串存储二进制编码,保留前导0 std::unordered_map<char, std::string> codes = { {'a', "0010"}, {'b', "0111"}, {'c', "1101"} }; std::string filename = "abc.txt"; // 若需使用霍夫曼树生成编码,确保相关函数已实现 // auto charFreq = fileReading(filename); // NodePtr tree=nullptr; // buildHuffmanTree(charFreq, tree); // printCodes(tree, ""); // 修正变量名:使用定义好的codes encodedhuff(codes, filename); return 0; }
关键修改点:
- 编码映射改为
unordered_map<char, std::string>,用字符串存储二进制编码,保留前导0。 - 输出时直接写入编码字符串,去掉分隔空格,保证编码连续。
- 修正拼写错误和未定义变量问题。
- 打开输出文件时移除
std::ios_base::app,避免多次运行追加内容。
验证效果
当abc.txt内容为abc时,运行代码后pride.huff文件内容会是预期的001001111101。
内容的提问来源于stack exchange,提问作者sabra baig
相关产品推荐
相关产品推荐

