作者achicn3 (Sher)
看板C_and_CPP
标题[问题] Huffman压缩/解压
时间Thu Dec 27 17:30:39 2018
开发平台(Platform): (Ex: Win10, Linux, ...)
Windows 10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Dev C 之後会移植到Qt上
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
目前针对txt档案是可以压缩 与 解压缩的
只是再对影片档 图片档 等其他档案无法压缩
喂入的资料(Input):
a.jpg
预期的正确结果(Expected Output):
压缩後的档案
STDOUT 会印出编码表
错误结果(Wrong Output):
STDOUT 印出空白 或是一两行乱码就没了
也无法进行解压缩
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://ideone.com/ZD7z1f
读档部分是
map<char, int> freqs; // frequency for each char from input text
int i;
// Opening input file
//
ifstream inputFile;
inputFile.open(inputFilepath,std::ifstream::binary | std::ifstream::in
);
if (!inputFile)
{
cerr<<"error: unable to open input file: " << inputFilepath <<endl
;
}
char ch[1]; //char
unsigned total = 0;
while (true)
{
inputFile.read((char*)ch,sizeof(ch));
if(inputFile.eof())
break;
//计算频率
freqs[ch[0]]++;
total++;
}
感觉是这部分问题
补充说明(Supplement):
有将档案读写部分改成用 c的 fopen(...,rb)
然後fread fwrite等等 可是依然只对txt档案有用
卡了很久感觉是开档读档的问题 可是又不知道哪里有问题 故来求解 谢谢各位
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 110.28.37.192
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1545903043.A.D37.html
1F:→ Schottky: char 如果是负值怎麽办12/27 17:40
我有想过用unsigned char可是在freqs[ch]++部分会爆掉
※ 编辑: achicn3 (110.28.37.192), 12/27/2018 17:44:46
刚刚利用
if(ch[0]<0) ch[0] = ~ch[0]
倒是可以压缩了 只是解压缩就解不出来了
※ 编辑: achicn3 (110.28.37.192), 12/27/2018 18:21:37
2F:→ jerryh001: 用unsigned freqs的型态也要改 直接取负号当然无法还原12/27 19:19
了解 刚刚发现发现会爆掉是下面的iterator没改型态 改了之後是可以运作没错
可是现在就算用unsigned char去读 非txt文档还是无法正常压缩 会像文章内说的错误结
果一样
※ 编辑: achicn3 (110.28.37.192), 12/27/2018 20:42:40
3F:推 longlongint: 先找二进位编辑器生小档案测试观察看看?12/27 21:24
Ok 还没尝试过
※ 编辑: achicn3 (110.28.37.192), 12/27/2018 23:51:07
我发现问题是在 我建立的新节点字元预设是空白 再根据是不是空白去选择位置
可是问题是档案本身可能包含空白字元 这样子该怎麽处理阿 利用字串吗?
※ 编辑: achicn3 (110.28.37.192), 12/28/2018 14:31:43
4F:→ poyenc: 统一用 read/write12/28 19:15
5F:推 longlongint: 空白的问题听起来跟跳脱字元的故事很像12/28 20:31
6F:推 rbufghj9713: 你会不会table有存错之类的?12/28 21:44
解决了...我将节点字元预设成\0就可以了
感谢各位的回覆
另外特别感谢版友 samuelcdf针对我的code改进寄站内信给我
※ 编辑: achicn3 (110.28.37.192), 12/28/2018 22:20:45