資源簡介
用huffman編碼實現(xiàn)的壓縮軟件:把文件A編碼成文件B,再把文件B翻譯成文件C,比較A與C

代碼片段和文件信息
#include“Huffman.h“
HuffmanTree::HuffmanTree()//?初始化
{
int?i;
for(i=0;i<511;i++)
{
node[i].weight?=0;
node[i].parent=-1;
node[i].lchild=-1;
node[i].rchild=-1;
node[i].code=““;
}
}
HuffmanTree::~HuffmanTree()
{}
void?HuffmanTree::GetWeight(char?file[])
{
ifstream?inf;
inf.open?(fileios::binary);
inf.unsetf?(ios::skipws?);
unsigned?char?byteFile;
int?pos=0;
while(inf.good())
{
byteFile=inf.get?();
if(inf.good())
node[byteFile].weight?++;
???}
inf.setf?(ios::skipws?);
inf.close?();
}
void?HuffmanTree::SelectSmall?(int?&leastint?&lessint?n)
{
int?ws1=-1ws2=-1;
least=less=-1;
int?i;
for(i=0;i {
if(node[i].parent==-1)
{
if(ws1==-1?||?node[i].weight {
ws2=ws1;
less=least;
ws1=node[i].weight;
least=i;
}
else?if(ws2==-1?||?node[i].weight {
ws2=node[i].weight;
less=i;
}
}
}
if(least==-1?||?less==-1)
least=-1;
}
void?HuffmanTree::CreateTree()
{
int?i;
int?leastless;
for(i=256;i<511;i++)
{
this->SelectSmall?(leastlessi);
node[least].parent?=i;
node[less].parent?=i;
node[i].lchild=least;
node[i].rchild?=less;
node[i].weight=node[least].weight+node[less].weight?;
}
}
void?HuffmanTree::GetCode()
{
int?mark[512];//編碼標志
int?i;
string?codeString=““;
for(i=0;i<511;i++)
mark[i]=0;//初始化編碼
int?p=510;//根節(jié)點
while(p>=0)
{
if(mark[p]==0)
{
mark[p]=1;//左節(jié)點編碼
if(node[p].lchild?>=0)
{
p=node[p].lchild;
codeString+=“0“;
}
else?if(node[p].rchild<0)
node[p].code=codeString;
}
else?if(mark[p]==1)
{
mark[p]=2;//右節(jié)點編碼
if(node[p].rchild>=0)
{
codeString+=“1“;
p=node[p].rchild;
}
}
else
{
p=node[p].parent;
codeString=codeString.substr(0codeString.length?()-1);
}
}
}
void?HuffmanTree::Encode(char?f1[]char?f2[])
{
ifstream?inf(f1ios::binary?);
ofstream?outf(f2ios::binary?);
inf.unsetf?(ios::skipws);//設置文件得讀取空白符
string?waiting=““;
unsigned?char?inByteoutByte;//用來構建讀入輸出字節(jié)
int?i;
while(inf.good())?
{
while(waiting.length()<8)
{
if(!inf.good())
break;
? inf.read?((char?*)?&inBytesizeof(unsigned?char));//讀取一個字節(jié)
if(inf.good())
waiting+=node[inByte].code;//得到該字節(jié)的huffman編碼
}
while(waiting.length()>7)
{
outByte=‘\0‘;//字節(jié)八位清零
for(i=0;i<8;i++)
{
outByte=outByte<<1;//左移一位
if(waiting[i]==‘1‘)
outByte|=1;
}
outf.write((char?*)&outBytesizeof(unsigned?char));//將得到的字節(jié)存入文件
waiting=waiting.substr?(8);//編碼字符串去除已存儲的前八位構成新的字符串
}
if(inf.eof?())
{
if(waiting.length?()==0)
outByte=static_cast(0);
else?//文件結束,但還剩最后一段不滿八位的編碼
{
????outByte=‘\0‘;
for(i=0;i<(int)waiting.length?();i++)
{
outByte=outByte<<1;
if(waiting[i]==‘1‘)
outByte|=1;
}
outByte=outByte<<(8-waiting.length?());//將編碼字段從尾部移到字節(jié)的高位
outf.write
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????108??2010-09-05?20:14??壓縮軟件\Huffman\a.txt
?????文件?????????60??2010-09-05?22:14??壓縮軟件\Huffman\b.txt
?????文件????????108??2010-09-05?22:14??壓縮軟件\Huffman\c.txt
?????文件???????4707??2010-09-05?18:33??壓縮軟件\Huffman\Huffman.cpp
?????文件???????3715??2010-09-03?23:14??壓縮軟件\Huffman\Huffman.dsp
?????文件????????522??2010-09-02?16:45??壓縮軟件\Huffman\Huffman.dsw
?????文件????????552??2010-09-03?21:33??壓縮軟件\Huffman\Huffman.h
?????文件??????66560??2010-09-05?23:19??壓縮軟件\Huffman\Huffman.ncb
?????文件??????49664??2010-09-05?23:19??壓縮軟件\Huffman\Huffman.opt
?????文件???????1218??2010-09-05?18:33??壓縮軟件\Huffman\Huffman.plg
?????文件????????336??2010-09-06?09:32??壓縮軟件\Huffman\Huffman.sln
????..A..H.??????6144??2010-09-06?09:32??壓縮軟件\Huffman\Huffman.suo
?????文件????????104??2010-09-05?18:33??壓縮軟件\Huffman\Main.cpp
?????文件???????1467??2010-09-03?23:13??壓縮軟件\Huffman\Run.cpp
?????文件????????190??2010-09-03?23:10??壓縮軟件\Huffman\Run.h
?????文件????????144??2010-09-03?21:30??壓縮軟件\Huffman\StdAfx.h
?????目錄??????????0??2010-09-07?14:12??壓縮軟件\Huffman
?????目錄??????????0??2010-10-10?22:44??壓縮軟件
-----------?---------??----------?-----??----
???????????????135599????????????????????18
評論
共有 條評論