用zlib压缩解压缩,请各位看看程序有什么问题

asdk77 2012-11-12 03:06:09
关于zlib压缩解压缩问题,请各位看看程序哪有问题?

1)createfile.c 将3句话压缩存入file.txt文档中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"

unsigned char* compression(const char* s)
{
unsigned char *buf;

unsigned long slen = strlen(s) +1;

unsigned long buflen = compressBound(slen);

buf = (unsigned char*)malloc(sizeof(unsigned char)*buflen);

compress(buf, &buflen, (const Bytef *)s, slen);

return buf;



}



void main()

{

FILE *pf;

char *p1 = "this document is distributed in the hope that it will be useful, but without any warranty;";

char *p2 = "without even the implied warranty of merchantability or fittness for a particular purpose;";

char *p3 = "you should have received a copy of the GNU General Public License along with this document;";

pf = fopen("file.txt", "wr");


unsigned char* temp;

temp = compression(p1);

fprintf(pf, "%s\n", temp);

free(temp); //相当用free了compression函数中的buf?

temp = compression(p2);

fprintf(pf, "%s\n", temp);

free(temp);

temp = compression(p3);

fprintf(pf, "%s\n", temp);

free(temp);

}


2) 从file.txt文档中读取压缩字符串进行解压缩,将解压后的字符串存入newfile.txt中


#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include"zlib.h"


#define LINE 1024


unsigned char *decompression(char* s)

{

unsigned char *dest;

unsigned long len = strlen(s) + 1;

unsigned long destlen = (len<<1)*2;

dest = (unsigned char*)malloc(sizeof(unsigned char)*destlen);

uncompress(dest, &destlen, s, len);

return dest;

}

void main()

{


FILE *pf = fopen("file.txt", "r");

FILE *nf = fopen("newfile.txt", "wr");

unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char)*LINE);

char *p;


if (pf == NULL)

{

printf ("File open error!\n");

exit (0);

}

p = fgets(buf, LINE, pf);

while (p)

{

unsigned char *temp = decompression(buf);

fprintf(nf, "%s", temp);

free(temp);

free(buf);

buf = (char *)malloc(sizeof(char)*LINE);

p = fgets(buf, LINE, pf);

}

free(buf);

fclose(pf);

fclose(nf);



}


若1)中输入的3句话均以大写开头,则能顺利解压成原文,若为小写则后2句无法解压。个人觉得是我的解压函数有问题,望解答!

非常感谢!
...全文
224 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdk77 2012-11-15
  • 打赏
  • 举报
回复
谢谢各位!!!
图灵狗 2012-11-13
  • 打赏
  • 举报
回复
举个例子字符串"ABCD"缩过后,很有可能B变成了'\0',这样你就只能写入"A"了;或者是结束符'\0'变成了'E',这样字符串"ABCDExxxxxxxxx"就会一直延续下去,直到碰到偶然的'\0'
图灵狗 2012-11-13
  • 打赏
  • 举报
回复
参见我的博文(http://blog.csdn.net/turingo/article/details/8178510)。
ryfdizuo 2012-11-12
  • 打赏
  • 举报
回复
你按照这个流程试试: 压缩 写二进制文件 读二进制文件 解压缩
qq120848369 2012-11-12
  • 打赏
  • 举报
回复
这是最简单的接口了, 用用Feed类的接口把。
whizer 2012-11-12
  • 打赏
  • 举报
回复
1)大写字母和小写字母压缩后的结果可能是不一样的. 2)你申请的是压缩后数据的2倍,这不一定能保证数据解压缩后内存够使,应该查找一下zlib的规范,好像从它的头部可以得到原数据的相关信息. 3)查一查zlib的格式,比较一下压缩后的文件和标准格式,debug一下.
图灵狗 2012-11-12
  • 打赏
  • 举报
回复
晕,压缩处理的是字节流,不要与字符串再扯上任何关系,所以 fprintf(pf, "%s\n", temp)和p = fgets(buf, LINE, pf)这类的用法都是不正确的。应该在写入的时候先写长度再写内容,读取的时候先读长度再读内容,用fread和fwrite函数进行操作。
======================================================== 服务器端解压操作说明: 1 用记事本打开 unzip.php ,在第二行,找到 “ $password = "isphp" ” 这一句, 将isphp 改成您的密码,等会解压时会要求输入。 2 将 unzip.php 上传到服务器端某个目录下,比如根目录。 3 运行 unzip.php, 看其给出的提示是否支持 zlib 库, 如果不支持,则在下面一步本地压缩时不要将"压缩成Gzip格式"选中。 4 在本机运行 phpZip.exe, 如果第3步中,unzip.php 提示说不支持zlib库,则不要选中 "压缩成Gzip格式", 否则压缩出的文件,在服务器端没法解压, 反之,如果支持的话,就选中,因为压缩成gz格式,可以大大减小文件大小。 5 运行 unzip.php,将刚才在本机压缩出的文件通过 unzip.php 上传,上传后会自动解压。 (也可以通过其它途径如 FTP 将文件上传到服务器,这样只要指定其位置即可。) ------------------------------------------------------- 服务器端打包下载操作说明 1 用记事本打开 unzip.php ,在第二行,找到 “ $password = "isphp" ” 这一句, 将isphp 改成您的密码,等会解压时会要求输入。 2 运行 zip.php , 输入想下载的目录,程序会给出一个链接, 点此链接(或者通过 FlashGet 一类工具) 就可以下载。 3 在本地运行 phpZip.exe 将下载下来的文件解压就行。 注: 如果想下载整个 zip.php 所在的当前目录,则输入 "." (点号) 即可。 这种情况下,在本地解压时,选择解压目的地时,最好选择一空的文件夹。 因为,当仅打包下载当前目录下的一个子目录时,在本地解压时, 程序会自动创建一个同名的文件夹, 而下载当前整个目录时,程序不会创建文件夹。 -------------------------------------------------------

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧