📄 lzdecode.cpp
字号:
#include<stdio.h>
#include<map>
#include<iostream>
#include<fstream>
#include"MyWord.h"
#define INTMAX 2147483647
using namespace std;
typedef map <long, MyWord> MyDic;
void lzdecode(ifstream& lzifs, ofstream& lzofs);
void write(MyDic & dic, long code, ofstream & lzofs);
int main(int arg,char* argv[]){
if(arg < 2) printf("请输入压缩源文件。\n格式如下:\nLzDecode 解压源文件名\n");//检查参数正确性
else{
ifstream lzifs;
lzifs.open(argv[1],ios::in|ios::binary);
if(!lzifs) printf("解压源文件不存在。\n");//检查源文件
else{
printf("Processing,please wait...\n");
ofstream lzofs;
string ofname;
ofname.assign(argv[1]);
ofname.assign(ofname.substr(0,ofname.find_last_of('.')));
lzofs.open(ofname.c_str(),ios::out|ios::binary);
lzdecode(lzifs,lzofs);
lzifs.close();
lzofs.flush();
lzofs.close();
printf("ok!\n");
}
}
return 0;
}
void lzdecode(ifstream& lzifs, ofstream& lzofs){
MyDic dic;
long no = 1;//全局,字典索引
char rd = 0;
MyWord * word = new MyWord();
long code = 0;
short stemp = 0;
while(lzifs.read((char*)&stemp,2)){//读取一个short,2bit
if(stemp < 0){//如果为正这该索引为short,如果为负则为int,继续读取下2个字节
code = (((long)stemp)<<16)&INTMAX;
lzifs.read((char*)&stemp,2);
code += ((long)stemp) &((1 << 16) - 1);
}
else code = (int)stemp;
if(code != 0){
write(dic, code, lzofs);//如果索引不为0,则写入该索引在字典中的值
}
if(lzifs.get(rd)){
lzofs.put(rd);//写入条目中的新加字节
word->index = code; //编辑当前条目
word->ch = rd;
dic.insert(MyDic::value_type(no,*word)); //将该条目加入字典,重建字典
no++;//全局索引加1
delete word;
word = new MyWord();//新建条目
}
}
if(!word) delete word;
}
void write(MyDic & dic, long code, ofstream & lzofs){
MyWord word = dic[code];
if(word.index != 0)
write(dic, word.index, lzofs);
lzofs.put(word.ch);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -