zlib压缩文件

压缩文件:
压缩代码

#include <stdio.h>  
#include "zlib.h"

int xiaoc()
{
  char *buf;
  int  len = 1000000;  //文件长度

  if ((buf = (char*)malloc(2*len)) == NULL)
  {
    printf("no enough memory!\n");
    return -1;
  }

  FILE *fp = fopen("D://aaaa.log", "rb");
  fread(buf, len, 1, fp);
  fclose(fp);
  /* 压缩 */
  gzFile fzip = gzopen("D://a.gz", "wb");
  gzwrite(fzip, buf, len);
  gzclose(fzip);

  if (buf != NULL)
  {
    free(buf);
    buf = NULL;
  }

  return 0;
}

参考文章:
http://www.cppblog.com/woaidongmao/archive/2009/09/07/95495.html

关键的函数有那么几个:

(1)int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

把源缓冲压缩成目的缓冲, 就那么简单, 一个函数搞定

(2) int compress2 (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen,int level);

功能和上一个函数一样,都一个参数可以指定压缩质量和压缩数度之间的关系(0-9)不敢肯定这个参数的话不用太在意它,明白一个道理就好了: 要想得到高的压缩比就要多花时间

(3) uLong compressBound (uLong sourceLen);

计算需要的缓冲区长度. 假设你在压缩之前就想知道你的产度为 sourcelen 的数据压缩后有多大, 可调用这个函数计算一下,这个函数并不能得到精确的结果,但是它可以保证实际输出长度肯定小于它计算出来的长度

(4) int uncompress (Bytef *dest, uLongf *destLen,const Bytef *source, uLong sourceLen);

解压缩(看名字就知道了:)

(5) deflateInit() + deflate() + deflateEnd()

3个函数结合使用完成压缩功能,具体用法看 example.c 的 test_deflate()函数. 其实 compress() 函数内部就是用这3个函数实现的(工程 zlib 的 compress.c 文件)

(6) inflateInit() + inflate() + inflateEnd()

和(5)类似,完成解压缩功能.

(7) gz开头的函数. 用来操作*.gz的文件,和文件stdio调用方式类似. 想知道怎么用的话看example.c 的 test_gzio() 函数,很easy.

(8) 其他诸如获得版本等函数就不说了.

总结: 其实只要有了compress() 和uncompress() 两个函数,在大多数应用中就足够了.

<think>我们使用zlib库在C++中进行文件压缩。以下是一个简单的示例,展示如何使用zlib压缩一个文件。步骤:1.打开源文件(待压缩文件)和目标文件(压缩后的文件)。2.使用zlib的deflate函数进行压缩。3.将压缩后的数据写入目标文件。注意:zlib提供了一系列函数,我们主要使用compress函数(这里我们使用更灵活的方式,因为文件可能较大,需要分块处理)。由于zlib压缩函数一次处理整个数据块可能不适用于大文件,因此我们采用分块压缩的方式。我们将使用gzip文件格式,因为zlib支持gzip格式。这里我们使用zlib的gzFile系列函数来简化操作。但是,用户要求使用zlib(而不是gzip的接口),所以我们使用基本的zlib流式压缩API。以下是一个使用zlib的deflate进行压缩的示例代码:注意:需要链接zlib库(-lz)代码步骤:a.打开源文件和目标文件(二进制模式)。b.初始化zlib的deflate流。c.循环读取源文件数据块,压缩并写入目标文件。d.结束压缩并清理资源。我们将写一个函数来压缩文件。注意:这里我们使用Z_DEFAULT_COMPRESSION,也可以指定压缩级别(0-9)。示例代码:</think>以下是使用 zlib 在 C++ 中压缩文件的示例代码,包含详细注释: ```cpp #include <iostream> #include <fstream> #include "zlib.h" bool compressFile(const std::string& inputPath, const std::string& outputPath) { // 打开输入文件(二进制模式) std::ifstream inFile(inputPath, std::ios::binary | std::ios::ate); if (!inFile) { std::cerr << "无法打开输入文件: " << inputPath << std::endl; return false; } // 获取文件大小并重置指针 const size_t fileSize = inFile.tellg(); inFile.seekg(0); // 读取文件内容到缓冲区 char* inputBuffer = new char[fileSize]; inFile.read(inputBuffer, fileSize); inFile.close(); // 准备输出缓冲区(压缩后大小通常小于等于源大小 + 0.1% + 12字节) uLong compressedSize = compressBound(fileSize); Bytef* outputBuffer = new Bytef[compressedSize]; // 执行压缩 int result = compress2( outputBuffer, // 输出缓冲区 &compressedSize, // 输入:缓冲区大小,输出:实际压缩大小 reinterpret_cast<Bytef*>(inputBuffer), // 输入数据 fileSize, // 输入数据大小 Z_BEST_COMPRESSION // 最高压缩级别 ); if (result != Z_OK) { std::cerr << "压缩失败: " << (result == Z_MEM_ERROR ? "内存错误" : result == Z_BUF_ERROR ? "缓冲区错误" : "未知错误") << std::endl; delete[] inputBuffer; delete[] outputBuffer; return false; } // 写入压缩文件 std::ofstream outFile(outputPath, std::ios::binary); if (!outFile.write(reinterpret_cast<char*>(outputBuffer), compressedSize)) { std::cerr << "写入输出文件失败" << std::endl; delete[] inputBuffer; delete[] outputBuffer; return false; } // 清理资源 delete[] inputBuffer; delete[] outputBuffer; outFile.close(); std::cout << "压缩成功!原始大小: " << fileSize << " 字节, 压缩后: " << compressedSize << " 字节" << std::endl; return true; } int main() { if (compressFile("original.txt", "compressed.zlib")) { std::cout << "文件已压缩为 compressed.zlib" << std::endl; } return 0; } ``` ### 关键步骤说明: 1. **头文件包含**:`#include "zlib.h"`(需安装zlib开发库) 2. **缓冲区准备**: - 使用 `compressBound()` 计算最大压缩大小 - 分配输入/输出缓冲区 3. **核心压缩**: - `compress2()` 函数实现压缩(参数:输出缓冲/输入数据/压缩级别) - 压缩级别 `Z_BEST_COMPRESSION` 可替换为 `0`(无压缩)到 `9`(最高压缩) 4. **错误处理**: - 检查返回值 `Z_OK`/`Z_MEM_ERROR`/`Z_BUF_ERROR` 5. **资源清理**: - 释放缓冲区内存 - 关闭文件句柄 ### 编译说明(Linux示例): ```bash g++ -o compressor compressor.cpp -lz ``` ### 注意事项: - 需要安装 zlib 开发包(如 Ubuntu 的 `sudo apt install zlib1g-dev`) - 大文件处理建议使用流式压缩(分块读取) - 解压需使用 `uncompress()` 函数 - 压缩文件无标准扩展名,常用 `.zz` 或 `.zlib`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值