C++语言,压缩解压文件
时间: 2023-12-04 15:05:04 浏览: 133
压缩与解压缩文件 C++
5星 · 资源好评率100%
在C++中,可以使用第三方库例如zlib来进行文件的压缩和解压缩。下面是一个简单的示例代码:
```c++
#include <iostream>
#include <fstream>
#include <zlib.h>
using namespace std;
const int BUFFER_SIZE = 1024;
// 压缩文件
void compressFile(const char* sourceFile, const char* destFile) {
// 打开源文件和目标文件
ifstream fin(sourceFile, ios::binary);
ofstream fout(destFile, ios::binary);
// 初始化zlib
z_stream zs;
memset(&zs, 0, sizeof(zs));
deflateInit(&zs, Z_DEFAULT_COMPRESSION);
// 循环读取源文件并压缩
char inBuffer[BUFFER_SIZE];
char outBuffer[BUFFER_SIZE];
zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
zs.avail_out = BUFFER_SIZE;
int flush;
do {
fin.read(inBuffer, BUFFER_SIZE);
zs.next_in = reinterpret_cast<Bytef*>(inBuffer);
zs.avail_in = fin.gcount();
flush = fin.eof() ? Z_FINISH : Z_NO_FLUSH;
while (zs.avail_in > 0) {
deflate(&zs, flush);
if (zs.avail_out == 0) {
fout.write(outBuffer, BUFFER_SIZE);
zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
zs.avail_out = BUFFER_SIZE;
}
}
} while (flush != Z_FINISH);
// 写入剩余的压缩数据
while (true) {
int status = deflate(&zs, Z_FINISH);
if (status == Z_STREAM_END) {
fout.write(outBuffer, BUFFER_SIZE - zs.avail_out);
break;
}
}
// 关闭文件和zlib
deflateEnd(&zs);
fin.close();
fout.close();
}
// 解压缩文件
void decompressFile(const char* sourceFile, const char* destFile) {
// 打开源文件和目标文件
ifstream fin(sourceFile, ios::binary);
ofstream fout(destFile, ios::binary);
// 初始化zlib
z_stream zs;
memset(&zs, 0, sizeof(zs));
inflateInit(&zs);
// 循环读取源文件并解压缩
char inBuffer[BUFFER_SIZE];
char outBuffer[BUFFER_SIZE];
zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
zs.avail_out = BUFFER_SIZE;
int flush;
do {
fin.read(inBuffer, BUFFER_SIZE);
zs.next_in = reinterpret_cast<Bytef*>(inBuffer);
zs.avail_in = fin.gcount();
flush = fin.eof() ? Z_FINISH : Z_NO_FLUSH;
while (zs.avail_in > 0) {
int status = inflate(&zs, flush);
if (status == Z_STREAM_END) {
fout.write(outBuffer, BUFFER_SIZE - zs.avail_out);
zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
zs.avail_out = BUFFER_SIZE;
} else if (status == Z_BUF_ERROR) {
fout.write(outBuffer, BUFFER_SIZE - zs.avail_out);
zs.next_out = reinterpret_cast<Bytef*>(outBuffer);
zs.avail_out = BUFFER_SIZE;
}
}
} while (flush != Z_FINISH);
// 关闭文件和zlib
inflateEnd(&zs);
fin.close();
fout.close();
}
int main() {
const char* sourceFile = "test.txt";
const char* compressedFile = "test.gz";
const char* decompressedFile = "test2.txt";
compressFile(sourceFile, compressedFile);
decompressFile(compressedFile, decompressedFile);
return 0;
}
```
这个示例代码实现了文件的压缩和解压缩,使用了zlib库。其中compressFile函数将指定的源文件压缩为目标文件,decompressFile函数将指定的压缩文件解压缩为目标文件。这个示例代码只是一个简单的示例,对于大文件的处理需要注意内存使用情况,可以分块进行处理。
阅读全文