C++经典小程序如何实现文件压缩解压?
C++是一种广泛应用于系统、应用、游戏等多个领域的编程语言。它具有高效、稳定、可移植等优点。在C++编程中,文件压缩和解压是一个常见的任务。本文将详细介绍如何使用C++实现文件压缩和解压。
一、文件压缩算法
文件压缩的目的是减小文件体积,以便于存储和传输。常见的文件压缩算法有Huffman编码、LZ77、LZ78等。这里我们以Huffman编码为例,介绍如何实现文件压缩。
- Huffman编码原理
Huffman编码是一种基于字符频率的压缩算法。它通过为频率较高的字符分配较短的编码,为频率较低的字符分配较长的编码,从而实现压缩。
- 实现步骤
(1)统计文件中每个字符的频率。
(2)根据字符频率构建Huffman树。
(3)根据Huffman树生成编码表。
(4)将文件内容按照编码表进行编码。
(5)将编码后的数据存储到压缩文件中。
二、文件解压
文件解压是将压缩文件还原为原始文件的过程。以下是以Huffman编码为例,介绍如何实现文件解压。
- 解压步骤
(1)读取压缩文件,获取编码表。
(2)根据编码表构建Huffman树。
(3)读取压缩文件中的编码数据。
(4)根据Huffman树解码,还原原始文件内容。
(5)将还原的文件内容保存到指定位置。
- 代码实现
以下是一个简单的C++示例,展示了如何使用Huffman编码实现文件压缩和解压。
#include
#include
#include
#include
#include
#include
using namespace std;
// 定义字符类型
using CharType = char;
// 定义节点类型
struct Node {
CharType ch;
int freq;
Node* left;
Node* right;
Node(CharType ch, int freq) : ch(ch), freq(freq), left(nullptr), right(nullptr) {}
};
// 比较函数,用于优先队列
struct Compare {
bool operator()(Node* a, Node* b) {
return a->freq > b->freq;
}
};
// Huffman编码类
class Huffman {
private:
unordered_map codeMap;
unordered_map reverseCodeMap;
// 构建Huffman树
Node* buildHuffmanTree(const vector>& freqMap) {
priority_queue, Compare> pq;
for (const auto& pair : freqMap) {
pq.push(new Node(pair.first, pair.second));
}
while (pq.size() > 1) {
Node* left = pq.top();
pq.pop();
Node* right = pq.top();
pq.pop();
Node* parent = new Node('\0', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
// 生成编码表
void generateCodeMap(Node* root, string str) {
if (!root) return;
if (root->ch != '\0') {
codeMap[root->ch] = str;
reverseCodeMap[str] = root->ch;
}
generateCodeMap(root->left, str + "0");
generateCodeMap(root->right, str + "1");
}
public:
// 压缩文件
void compress(const string& inputPath, const string& outputPath) {
ifstream inputFile(inputPath);
ofstream outputFile(outputPath);
if (!inputFile.is_open() || !outputFile.is_open()) {
cerr << "File open failed." << endl;
return;
}
unordered_map freqMap;
while (inputFile.get(ch)) {
freqMap[ch]++;
}
vector> freqVec;
for (const auto& pair : freqMap) {
freqVec.push_back(pair);
}
Node* root = buildHuffmanTree(freqVec);
generateCodeMap(root, "");
string compressedData;
ifstream inputFile2(inputPath);
while (inputFile2.get(ch)) {
compressedData += codeMap[ch];
}
outputFile << compressedData;
}
// 解压文件
void decompress(const string& inputPath, const string& outputPath) {
ifstream inputFile(inputPath);
ofstream outputFile(outputPath);
if (!inputFile.is_open() || !outputFile.is_open()) {
cerr << "File open failed." << endl;
return;
}
string compressedData;
while (inputFile.get(ch)) {
compressedData += ch;
}
string decodedData = "";
string code = "";
for (char ch : compressedData) {
code += ch;
if (reverseCodeMap.find(code) != reverseCodeMap.end()) {
decodedData += reverseCodeMap[code];
code = "";
}
}
outputFile << decodedData;
}
};
int main() {
Huffman huffman;
huffman.compress("input.txt", "output.txt");
huffman.decompress("output.txt", "decompressed.txt");
return 0;
}
三、总结
本文介绍了如何使用C++实现文件压缩和解压。通过Huffman编码算法,我们可以有效地减小文件体积,提高存储和传输效率。在实际应用中,可以根据需求选择合适的压缩算法,实现文件压缩和解压。
猜你喜欢:一对一音视频