Zib应用场景
(1)节约空间
当需要将一个很占内存的变量写入文件以节省内存时,可以先压缩一下,然后写入文件,当需要使用时再从文件中读出,然后解压缩,以便节省IO时间。此外,有些情况可能还要序列化一下,当要压缩的内存不是一段连续的内存的时候。
(2)节约网络流量
待发送的数据包比较大,且网络流量有限时,这两个函数也能派上用场。发送数据包前,先将数据包buffer压缩一下;接收方收到数据后再解压一下,这样接收方就能得到原始数据了。
作用功能:
使用c++将文件压缩成zip文件,然后使用解压缩恢复成原文件。
使用vs建工程后放入源码:
#include <cstring> #include <cstdlib> #include <iostream> #include "zlib.h" using namespace std; int Compress(char * DestName, const char *SrcName); int UnCompress(char * DestName, const char *SrcName); int main() { Compress("1.zip", "11.docx"); UnCompress("22.docx", "1.zip"); } int Compress(char * DestName, const char *SrcName) { char SourceBuffer[102400] = { 0 }; //压缩文件时的源buffer FILE* fp; //打开欲压缩文件时文件的指针 FILE* fp1; //创建压缩文件时的指针 errno_t err; //错误变量的定义 #ifdef WINDOWS_PLATFORM err = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件 if (err) { printf("文件打开失败! \n"); return 1; } #endif #ifdef WINDOWS_CE_PLATFORM fp = fopen_s(SrcName, "r+b");//打开欲压缩的文件 if (fp) { printf("文件打开失败! \n"); return 1; } #endif err = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件 if (err) { printf("文件打开失败! \n"); return 1; } //获取文件长度 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); 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中的数据 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"); fwrite(uDestBuffer, uDestBufferLen, 1, fp4); fclose(fp4); return 0; }在工程文件夹中需要加入Zlib.lib以及Zlib.dll中,并且在附加依赖库中加入:
使用的Zlib.lib以及Zlib.dll不是自己本机编译的。
本机只编译好了obj文件,编译lib文件时出现问题如下:
参考文献: http://blog.csdn.net/chenlycly/article/details/40477755
成功参考:http://www.cnblogs.com/fairycao/archive/2009/12/09/1620414.html
失败参考:http://blog.chinaunix.net/uid-24599332-id-2122842.html
编译obj文件以及lib文件(obj成功,lib未成功):
http://blog.csdn.net/qq292386890/article/details/49620633
相关问题:
如果出现:Cannot open include file:'unistd.h': No such file or directory
可以参考:http://www.iyunv.com/thread-42241-1-1.html
Windows下使用命令行编译C/C++文件
参考:http://blog.csdn.net/u010602592/article/details/50525634
当然也可以直接用vs2015打开C:\zlib-1.2.11\contrib\vstudio\vc12 路径下的sln工程文件了编译(测试vc14的不通过,vc12的点进去会提升升级,升级后就能成功编译了。)