檔案壓縮與解壓

2021-07-15 03:12:38 字數 4096 閱讀 7257

檔案壓縮與解壓思想:

(1)統計字元出現次數,結合最小堆的性質生成哈夫曼樹; (2

)對葉節點進行編碼,結點左邊編

0,右邊編1;

(3)讀取檔案,用哈夫曼編碼代替字元產生新的字元,即壓縮; (4

)讀取壓縮檔案,進行哈夫曼編碼的解讀產生相應字元,即解壓;

例如,對以下資料生成哈夫曼樹,以及產生相應的哈夫曼編碼:

//自己寫的最小堆(因為在加強鞏固,所以沒用stl裡的)

#pragma once

#include#includeusing namespace std;

templatestruct less

};template>

class heap

heap(const t*v, int size, int valid)

int _size = _v.size();

int begin = (_size - 2) / 2;

for (int root = begin; root >= 0; root--)

}void insert(const t& value)

void remove()

t& gettop()

bool empty()

int size()

protected:

void adjustdown(int root)

else

break;

} }void adjustup(int leaf)

else

break;

} }private:

vector_v;

};

//哈夫曼樹的建立

#pragma once

#include#include#include"heap.h"

using namespace std;

templatestruct huffmantreenode

};templateclass huffmantree

node* getroot()

protected:

void _creathuffmantree(const t*a,int size,t invaild)

//當_v中只剩下乙個資料時,哈弗曼樹建立完成

while (hp.size()>1)

_root = hp.gettop();

}private:

node* _root;

};

//檔案壓縮與解壓

#pragma once

#include#includeusing namespace std;

#include"huffmantree.h"

struct charinfo

charinfo(const unsigned char ch)

:_ch(ch)

{} long operator+(const charinfo& info)const

bool operator!=(const charinfo& info)const

bool operator

class filecompress

//開啟檔案成功

//1、字元與下標對應,填充結構體的_ch

for (int i = 0; i < 256; i++)

//2、統計各個字元出現的次數

unsigned char ch = fgetc(fread);

while (!feof(fread))

//3、建立哈夫曼樹

huffmantreehft(_info, 256, charinfo());

//4、獲取各個字元的哈夫曼編碼

//每次都從根節點開始,走到葉節點,即得到葉節點對應字元的編碼

huffmantreenode*root = hft.getroot();

string code;

gethuffmancodeofchar(root, code);

//5、從頭開始讀檔案,把讀取字元的編碼重新組合寫入壓縮檔案中

fseek(fread, 0, seek_set);

//壓縮產生的檔案的名字

string fcp = filename;

fcp += ".compress";

file* fwrite = fopen(fcp.c_str(), "wb");

if (fwrite == null)

//開啟檔案成功

unsigned char data = 0;//寫入壓縮檔案的字元

int offset = 7;//偏移量

ch = fgetc(fread);

while (!feof(fread))

if (offset < 0)

str++;

}ch = fgetc(fread);

} fputc(data, fwrite);

writeconfig(filename);

fclose(fread);

fclose(fwrite);

} void uncompress(const char* filename)

//開啟檔案成功

//3、建立哈夫曼樹

charinfo info[256];

readconfig(filename, info);

huffmantreehft(info, 256, charinfo());

string fucp = filename;

fucp += ".uncompress";

file* fwrite = fopen(fucp.c_str(), "wb");

huffmantreenode*root = hft.getroot();

huffmantreenode*cur = root;//每次都要從根開始讀,讀到葉節點即可獲取乙個原字元

long datatotal = (root->_weight)._count;//原檔案中的字元總數

unsigned char ch = fgetc(fread);

while (datatotal)

else

if (cur->_left == null&&cur->_right == null)}}

ch = fgetc(fread);

} fclose(fread);

fclose(fwrite);

}protected:

void writeconfig(const char*filename)

//開啟成功

for (int i = 0; i < 256; i++)

}fclose(fwrite);

} void readconfig(const char*filename,charinfo *info)

//開啟成功

char str[100];

while (fgets(str, 100, fread))

else

pstr+=2;//跳過分隔符(逗號)

//得到_count的字串形式

long count = 0;

while (*pstr&&*pstr!=',')

info[ch]._count = count;//得到出現次數

pstr++;

string code(pstr);

info[ch]._code = code;

} }void gethuffmancodeofchar(huffmantreenode*root, string& code)

gethuffmancodeofchar(root->_left, code + '0');//左邊編碼為0

gethuffmancodeofchar(root->_right, code + '1');//右邊編碼為1

}private:

charinfo _info[256];//結構體陣列

};

檔案壓縮與解壓

檔案的壓縮 1.讀取檔案的內容 2.統計每個字元出現的次數 int read while read bis.read 1 直至讀到檔案結束 arrays為運算元組的工具類 collections為操作集合工具類 bis.close 3.構建哈弗曼樹,生成哈夫曼編碼 if node.getleftno...

檔案壓縮與解壓縮

類 zipfile 構造方法 zipfile file file 開啟供閱讀的zip檔案,由指定的file物件給出。zipfile file file,int mode 開啟新的zipfile以使用指定模式從指定file物件讀取 zipfile string name 開啟zip檔案進行閱讀 方法摘...

檔案壓縮與解壓縮

public class zipfileutil zipoutputstream zostream null fileinputstream fistream null fileoutputstream fostream null try zostream.closeentry issuccess ...