C++经典小程序如何实现文件压缩解压?

C++是一种广泛应用于系统、应用、游戏等多个领域的编程语言。它具有高效、稳定、可移植等优点。在C++编程中,文件压缩和解压是一个常见的任务。本文将详细介绍如何使用C++实现文件压缩和解压。

一、文件压缩算法

文件压缩的目的是减小文件体积,以便于存储和传输。常见的文件压缩算法有Huffman编码、LZ77、LZ78等。这里我们以Huffman编码为例,介绍如何实现文件压缩。

  1. Huffman编码原理

Huffman编码是一种基于字符频率的压缩算法。它通过为频率较高的字符分配较短的编码,为频率较低的字符分配较长的编码,从而实现压缩。


  1. 实现步骤

(1)统计文件中每个字符的频率。

(2)根据字符频率构建Huffman树。

(3)根据Huffman树生成编码表。

(4)将文件内容按照编码表进行编码。

(5)将编码后的数据存储到压缩文件中。

二、文件解压

文件解压是将压缩文件还原为原始文件的过程。以下是以Huffman编码为例,介绍如何实现文件解压。

  1. 解压步骤

(1)读取压缩文件,获取编码表。

(2)根据编码表构建Huffman树。

(3)读取压缩文件中的编码数据。

(4)根据Huffman树解码,还原原始文件内容。

(5)将还原的文件内容保存到指定位置。


  1. 代码实现

以下是一个简单的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编码算法,我们可以有效地减小文件体积,提高存储和传输效率。在实际应用中,可以根据需求选择合适的压缩算法,实现文件压缩和解压。

猜你喜欢:一对一音视频