Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106062
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 188
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-23 19:19
文章分类

全部博文(33)

文章存档

2015年(22)

2014年(11)

我的朋友

分类: C/C++

2015-01-11 08:42:23

来源: http://blog.csdn.net/turingo/article/details/8178510#comments
不少网友读完zlib库compress和uncompress函数的使用方法这篇文章之后,仍然无法独立完成简单的文件压缩和解压缩功能,为此作者在这里追加这样的演示代码。问题的根源在于这些网友对于字符串和字节流的概念非常的模糊,对文本文件和二进制文件的区别常常模棱两可,其实字节流可以表示所有的数据,二进制文件才是任何文件的本质。字节流是一个字节接一个字节,并没有结束符号,所以需要给它一个长度信息。二进制文件是一个字节接一个字节,并没有换行符之类的。

文件压缩的时候,可以通过源文件的长度自动计算缓冲区的长度,压缩后写入目标文件之前,需先保留源文件和目标数据的长度作为解压缩的依据,参考如下代码:


  1. #include   
  2. #include   
  3. #include   
  4.   
  5. int main(int argc, char* argv[])  
  6. {  
  7.     FILE* file;  
  8.     uLong flen;  
  9.     unsigned char* fbuf = NULL;  
  10.     uLong clen;  
  11.     unsigned char* cbuf = NULL;  
  12.   
  13.     /* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */  
  14.     if(argc < 3)  
  15.     {  
  16.         printf("Usage: zcdemo srcfile dstfile\n");  
  17.         return -1;  
  18.     }  
  19.   
  20.     if((file = fopen(argv[1], "rb")) == NULL)  
  21.     {  
  22.         printf("Can\'t open %s!\n", argv[1]);  
  23.         return -1;  
  24.     }  
  25.     /* 装载源文件数据到缓冲区 */  
  26.     fseek(file, 0L, SEEK_END);    /* 跳到文件末尾 */  
  27.     flen = ftell(file);        /* 获取文件长度 */  
  28.     fseek(file, 0L, SEEK_SET);  
  29.     if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL)  
  30.     {  
  31.         printf("No enough memory!\n");  
  32.         fclose(file);  
  33.         return -1;  
  34.     }  
  35.     fread(fbuf, sizeof(unsigned char), flen, file);  
  36.     /* 压缩数据 */  
  37.     clen = compressBound(flen);  
  38.     if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL)  
  39.     {  
  40.         printf("No enough memory!\n");  
  41.         fclose(file);  
  42.         return -1;  
  43.     }  
  44.     if(compress(cbuf, &clen, fbuf, flen) != Z_OK)  
  45.     {  
  46.         printf("Compress %s failed!\n", argv[1]);  
  47.         return -1;  
  48.     }  
  49.     fclose(file);  
  50.   
  51.     if((file = fopen(argv[2], "wb")) == NULL)  
  52.     {  
  53.         printf("Can\'t create %s!\n", argv[2]);  
  54.         return -1;  
  55.     }  
  56.     /* 保存压缩后的数据到目标文件 */  
  57.     fwrite(&flen, sizeof(uLong), 1, file);    /* 写入源文件长度 */  
  58.     fwrite(&clen, sizeof(uLong), 1, file);    /* 写入目标数据长度 */  
  59.     fwrite(cbuf, sizeof(unsigned char), clen, file);  
  60.     fclose(file);  
  61.   
  62.     free(fbuf);  
  63.     free(cbuf);  
  64.   
  65.     return 0;  
  66. }  

文件解压缩的时候,可以通过保留信息得到缓冲区和数据流的大小,这样解压缩后直接保存即可,参考如下代码:


  1. #include   
  2. #include   
  3. #include   
  4.   
  5. int main(int argc, char* argv[])  
  6. {  
  7.     FILE* file;  
  8.     uLong flen;  
  9.     unsigned char* fbuf = NULL;  
  10.     uLong ulen;  
  11.     unsigned char* ubuf = NULL;  
  12.   
  13.     /* 通过命令行参数将srcfile文件的数据解压缩后存放到dstfile文件中 */  
  14.     if(argc < 3)  
  15.     {  
  16.         printf("Usage: zudemo srcfile dstfile\n");  
  17.         return -1;  
  18.     }  
  19.   
  20.     if((file = fopen(argv[1], "rb")) == NULL)  
  21.     {  
  22.         printf("Can\'t open %s!\n", argv[1]);  
  23.         return -1;  
  24.     }  
  25.     /* 装载源文件数据到缓冲区 */  
  26.     fread(&ulen, sizeof(uLong), 1, file);   /* 获取缓冲区大小 */  
  27.     fread(&flen, sizeof(uLong), 1, file);   /* 获取数据流大小 */  
  28.     if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL)  
  29.     {  
  30.         printf("No enough memory!\n");  
  31.         fclose(file);  
  32.         return -1;  
  33.     }  
  34.     fread(fbuf, sizeof(unsigned char), flen, file);  
  35.     /* 解压缩数据 */  
  36.     if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL)  
  37.     {  
  38.         printf("No enough memory!\n");  
  39.         fclose(file);  
  40.         return -1;  
  41.     }  
  42.     if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK)  
  43.     {  
  44.         printf("Uncompress %s failed!\n", argv[1]);  
  45.         return -1;  
  46.     }  
  47.     fclose(file);  
  48.   
  49.     if((file = fopen(argv[2], "wb")) == NULL)  
  50.     {  
  51.         printf("Can\'t create %s!\n", argv[2]);  
  52.         return -1;  
  53.     }  
  54.     /* 保存解压缩后的数据到目标文件 */  
  55.     fwrite(ubuf, sizeof(unsigned char), ulen, file);  
  56.     fclose(file);  
  57.   
  58.     free(fbuf);  
  59.     free(ubuf);  
  60.   
  61.     return 0;  
  62. }  
阅读(5036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~