C++ zip文件的解压与压缩

原创 2015年07月10日 13:02:31

1、下载解压文件的库http://download.csdn.net/detail/yimengchenxi/8887025

2、在项目中添加相关文件

在Debug中添加zlib1.dll文件,其他文件加载到项目中

3、实现的代码

#pragma comment(lib,"zlib1")

//压缩文件
int Compress(char * DestName, const char *SrcName)
{
 char SourceBuffer[102400] = { 0 };  //压缩文件时的源buffer

 FILE* fp;  //打开欲压缩文件时文件的指针
 FILE* fp1;  //创建压缩文件时的指针
 errno_t err; //错误变量的定义
 err = fopen_s(&fp, SrcName, "r+b");
 //获取文件长度
 long cur = ftell(fp);
 fseek(fp, 0L, SEEK_END);
 long fileLength = ftell(fp);
 fseek(fp, cur, SEEK_SET);


 //读取文件到buffer
 fread(SourceBuffer, fileLength, 1, fp);
 fclose(fp);

 //压缩buffer中的数据
 uLongf SourceBufferLen = 102400;
 char* DestBuffer = (char*)::calloc((uInt)SourceBufferLen, 1);
 err = compress((Bytef*)DestBuffer, (uLongf*)&SourceBufferLen, (const Bytef*)SourceBuffer, (uLongf)fileLength);
 if (err != Z_OK)
 {
  cout << "压缩失败:" << err << endl;
  return 1;
 }

 //创建一个文件用来写入压缩后的数据
 err = fopen_s(&fp1, DestName, "w+b");
 if (!fp1)
 {
  printf("压缩文件创建失败! \n");
  return 1;
 }

 fwrite(DestBuffer, SourceBufferLen, 1, fp1);
 cout << "压缩结束" << endl;
 fclose(fp1);
 return 0;
}


//解压缩文件
int UnCompress(char * DestName, const char *SrcName)
{
 char uSorceBuffer[102400] = { 0 };  //解压缩文件时的源buffer
 FILE* fp3;  //打开欲解压文件的文件指针
 FILE* fp4;  //创建解压文件的文件指针
 errno_t err; //错误变量的定义
 //打开欲解压的文件
 err = fopen_s(&fp3, SrcName, "r+b");
 if (err)
 {
  printf("文件打开失败! \n");
  return 1;
 }

 //获取欲解压文件的大小
 long ucur = ftell(fp3);
 fseek(fp3, 0L, SEEK_END);
 long ufileLength = ftell(fp3);
 fseek(fp3, ucur, SEEK_SET);


 //读取文件到buffer
 fread(uSorceBuffer, ufileLength, 1, fp3);
 fclose(fp3);

 uLongf uDestBufferLen = 1024000;//此处长度需要足够大以容纳解压缩后数据
 char* uDestBuffer = (char*)::calloc((uInt)uDestBufferLen, 1);
 //解压缩buffer中的数据
 /*
 int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
 uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。
 sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二
 个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest
 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解
 压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求
 在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大
 小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数
 退出后, destLen 是解压出来的数据的实际大小。
 */
 err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength);

 if (err != Z_OK)
 {
  cout << "解压缩失败:" << err << endl;
  return 1;
 }

 //创建一个文件用来写入解压缩后的数据
 err = fopen_s(&fp4, DestName, "wb");
 if (err)
 {
  printf("解压缩文件创建失败! \n");
  return 1;
 }

 //printf("写入数据... \n");
 cout << "解压数据成功!" << endl;

 /*
 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream );
 这是fwrite的MSDN标准参数表,其中buffer是需要向文件中写入的内容在内存中的首地址指针,
 size是待写入内容的每个元素的字节数,count是要写多少个元素,stream 是文件指针
 */
 fwrite(uDestBuffer, uDestBufferLen, 1, fp4);
 //cout << uDestBuffer << endl;
 fclose(fp4);
 return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

WIN7+VS2008+C++下7zipSDK压缩解压缩的使用

1.官方最新版下载地址http://www.7-zip.org/sdk.html 下载下来的文件如图: 打开下面这个目录: 打开VS2008命令工具: 将命令行...

使用zlib库解压*.zip文件

1.编辑zlib静态库 1)实现zip文件压缩和解压的zlib库部分代码(基于zlib-1.2.5) 这是zlib-1.2.5源码:http://download.csdn.net/download/...

Zip Utils--简单优雅的C++接口

在codeproject上看到的大神写的,真牛逼。 地址: http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-sim...

文件压缩(平台Linux & 语言C++)

这篇博文没有给出源码,如果需要这个项目的源码,可以到https://github.com/common1994/Project/tree/master/FileCompress下载。 (1)项目背...

用C++实现文件压缩

乍一听,这个文件压缩的名字貌似是很高大上的,其实,在数据结构中学完Huffman树之后,就可以理解这个东西其实不是那么的高不可攀。 文件压缩 所谓文件压缩,其实就是将对应的字符编码转换为另一种占据字...

c++使用zlib和minizip压缩文件

zlib的安装可以参照http://blog.sina.com.cn/s/blog_6e0693f70100sjgj.html这篇文章的做。我用的是1.28版本的也是可以的。 要注意的是6个项目,主要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)