问题 如何使用zlib轻松压缩和解压缩文件? [关闭]


如何使用zlib轻松压缩和解压缩文件?


1478
2018-04-13 12:16


起源

你读过了吗? zlib的  文件?如果是这样,你有什么尝试?如果您尝试的内容不起作用,请发布您的代码并说出发生了什么。 - Mark Adler


答案:


对于减压:

char buf[1024*1024*16];
gzFile *fi = (gzFile *)gzopen("file.gz","rb");
gzrewind(fi);
while(!gzeof(fi))
{
    int len = gzread(fi,buf,sizeof(buf));
        //buf contains len bytes of decompressed data
}
gzclose(fi);

用于压缩

gzFile *fi = (gzFile *)gzopen("file.gz","wb");
gzwrite(fi,"my decompressed data",strlen("my decompressed data"));
gzclose(fi);

14
2018-04-13 12:30



@Cristi:我收到一个错误: main.cpp invalid conversion from const void *'to void*' 在这条线上: gzwrite(fi,"my decompressed data",strlen("my decompressed data"));。你可以帮我吗? - Datoxalas
尝试gzwrite(fi,(void const *)“我的解压缩数据”,strlen(“我的解压缩数据”)); - Cristi
@Cristi:我得到了同样的错误。 - Datoxalas
好吧,似乎在你的zlib发行版中,gzwrite将void *作为第二个参数而不是像我的那样使用const void *。一个快速的错误修复将是gzwrite(fi,(void *)“我的解压缩数据”,strlen(“我的解压缩数据”)); - Cristi
@Cristi:现在我得到了: [Linker error] undefined reference to 'gzopen'。 - Datoxalas


请仔细阅读。该信息已经可用 这里
这是即使在谷歌上显示的第一个链接。


2
2018-04-13 12:23



我发现文档很简单。是不是只有像compress()decompress()这样的简单函数? - Datoxalas
@Downvoter:关心为什么要downvote? OP在原始问题中从未提及他/她不理解zlib网站上的示例。我提供了那些链接,哪有错误? - Alok Save
我会说任何在SO上提出这样问题的人应该很明显他们已经RTFM并且仍然需要帮助,我发现zlib“示例”对我自己来说非常无益,我们大多数人都没有尝试解压缩stdin,例如。 - osirisgothra
@Datoxalas是的,事实上 compress() 和 uncompress() zlib提供的功能。你有没看过文件? - Mark Adler


如果你可以使用boost,我会推荐使用boost iostreams API。见 提升iostreams教程。它支持GZIP和BZIP2压缩器和解压缩器。


-1
2017-10-16 21:15