原理简介:
若文本为 'aaassd' ,此时给aaassd 编号: a编为0,s编位11,d编为10 此时只要在压缩后的文件中输入‘0a11s10d“00011111”“00000000”7’ “xxxxxxxx”代表对应的acsii字符。
mark:
c++以二进制打开文件:
ifstream fin(file,ios_base::in|ios_base::binary);
ofstream fout(file.append(".jy"),ios_base::out|ios::binary);
priority_queue:
struct cmp
{
bool operator()(huffchar a,huffchar b)
{
return (a.count > b.count);
}
};
priority_queue<huffchar, vector<huffchar>, cmp> Q;
void PriQueue()
{
for(int i(0); i<huffcount; i++)
{
Q.push(huff[i]);
}
}
基于priority_queue的建树:
phuffchar Create() //返回根节点
{
//ÒÀ´Î½¨Ê÷
phuffchar newhuffc;
while(Q.size() >= 2)
{
newhuffc = (phuffchar)malloc(sizeof(huffchar));
phuffchar child1= (phuffchar)malloc(sizeof(huffchar)),child2= (phuffchar)malloc(sizeof(huffchar));
*child1 = Q.top(); Q.pop(); //cout << child1->data << endl;
*child2 = Q.top(); Q.pop(); //cout << child2->data << endl;
newhuffc->lchild = child1; newhuffc->rchild = child2;
newhuffc->count = child1->count +child2->count;
newhuffc->data = 'n' ;
//cout << newhuffc->lchild->data << newhuffc->lchild->count << endl;
//cout << newhuffc->rchild->data << newhuffc->rchild->count << endl;
Q.push(*newhuffc);
}
newhuffc = (phuffchar)malloc(sizeof(huffchar));
*newhuffc = Q.top(); Q.pop();
//cout << newhuffc->data << newhuffc->count << endl;
//cout << newhuffc->lchild->data << newhuffc->lchild->count << endl;
return newhuffc;
}
最后补上去的位数以char数字的形式计入文件尾:
//最后凑齐8位,末尾补0,以char形式计入,进行输出
while(bufcount!=8)
{
remain++;
buf = (buf<<1); bufcount++;
}
fout.put(buf);
fout.put(remain);
函数
std::
isalnum :
- digits (
0123456789
) - uppercase letters (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
) - lowercase letters (
abcdefghijklmnopqrstuvwxyz
)
- uppercase letters
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- lowercase letters
abcdefghijklmnopqrstuvwxyz