所以我在Ubuntu上使用zlib包。 我正在尝试弄清楚如何正确使用gzopen和gzread,这是到目前为止

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>

#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024

char buf[BUFFER_LENGTH];
int main(int argc, const char* argv[])
{
    int status;
    gzFile file;
    file = gzopen("beowulf.txt", "w");
    int counter = 0; /*when the counter reachers BUFFERS_FULL, stop*/
    if(file == NULL)
    {
        printf("COULD NOT OPEN FILE\n");
        return 1;
    }
    while(counter < NUM_BUFFERS)
    {
        status = gzread(file, buf, BUFFER_LENGTH - 2);
        printf("STATUS: %d\n", status);
        buf[BUFFER_LENGTH - 1] = "\0";
        printf("%s\n", buf);
        counter++;
    }
    gzclose(file);
    printf("STATUS: %d\n", status);
    return 0;
}

gzread("STATUS: %d\\n",status); 返回-2,我不知道为什么。 任何帮助,将不胜感激。

#1楼 票数:6 已采纳

模式"w"表示您正在准备创建新的存档:

file = gzopen("beowulf.txt", "w");

您刚刚将文件截断为零长度。

另外,您应该使用二进制模式标志: "wb""rb"

另外,您假定的.gz-archive具有扩展名.txt

阅读docs ,docs规则。 :)

#2楼 票数:1

使用函数gzerror()记录错误类型。 由于它是-2,所以不会是文件结束错误。 可能是以下任何错误。

Z_DATA_ERROR

读取数据时发生CRC错误; 该文件已损坏。

Z_STREAM_ERROR

流无效,或处于无效状态。

Z_NEED_DICT

需要一个字典(请参阅inflateSetDictionary())。

Z_MEM_ERROR

没有足够的内存可用于解压缩。

#3楼 票数:1

http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-gzread-1.html

  1. 如果返回值是正数,则为读取的字节数,您可以使用该值将NULL终止符放在正确的位置。
  2. 如果返回码<0 ,则可以使用gzerror来计算出错误所在。

  ask by Sam P translate from so

未解决问题?本站智能推荐:

2回复

在C中使用zlib

我目前正在学习C,并且在尝试制作一个使用zlib的小程序时遇到一些问题。 我已经设法使用zlib库编译了我的应用程序(使用Codeblocks / MinGW),并且编译正常。 我使用了一个基于官方zlib站点(zlib.net)上的zpipe.c示例的示例。 执行后,将创建输出z
1回复

Zlib inflate 的工作方式与 C 不同?

我试图在 java 中 zlib 膨胀一个字节数组,但是当我膨胀它时我没有得到 Z_STREAM_END 返回。 我的代码与我查看的一些 C 代码完全相同,这些代码使用相同的数据、滑动窗口和其他参数(我认为?)。 我正在使用 JZlib。 这是我的 Java 代码(dgboff 只是这个 zlib
1回复

PHP(ZLIB)的C(ZLIB)压缩数组的未压缩返回乱码

我有一组ZLIB压缩/ base64编码的字符串(在C程序中完成),存储在数据库中。 我写了一个小的PHP页面,该页面应该检索这些值并绘制它们(该字符串最初是浮点列表)。 压缩/编码的C程序块: (示例)原始输入格式: 每列都被压缩/编码为单个字符串。 为了重建原始数据
3回复

在C中放气和膨胀(zlib.h)

我正在尝试实现zlib.h deflate和inflate函数来压缩和解压缩char数组(而不是文件)。 我想知道以下语法是否正确? 我错过了什么或定义错误的东西? char a[50] = "Hello World!"; char b[50]; char c[50]; // def
1回复

C.循环压缩+发送(gzip)ZLIB

我目前正在用C构建HTTP服务器。 请介意这段代码: 这个想法是:我正在尝试一个接一个地发送gzip的缓冲区(当它们被连接时)是一个整体请求。 但是:目前,我的客户端(浏览器)仅获取第一个缓冲区的信息。 完全没有错误。 如何完成这项工作,如何在循环内gzip一些缓冲区
1回复

gzread 是否修改输入 buf 值?

我正在阅读zlib 手册,并且想知道 gzread 函数: ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); 这给出了未压缩的字节数,但是这个函数还有其他的东西吗? 我怀疑是这种情况(因为似乎没有将指针传
1回复

Zlib在C中解压缩未知压缩长度的字节

我正在尝试在没有任何外部库的情况下编写自己的 png 阅读器。 我需要使用 Zlib 来解压缩 png 的 IDAT 块。 我已经设法使用zlib.decompress()在 python 中完成它,并且我试图在 C 中复制它。我正在阅读 zlib 的文档并找到uncompress() ,但是它需要
1回复

使用zlib / minizip解压缩zip文件:C / C ++应用程序

我的要求是解压缩从Linux平台上的服务器收到的zip文件。 现在,我的C/C++ code应该将文件夹解压缩以接收json文件。 我在网上进行了研究,发现可以为此目的使用zlib库,但是zlib无法解压缩.zip文件,但是在其contrib文件夹中有minizip可用于此目的。
1回复

ZLib和memcpy

在Zlib算法中,我们具有解码功能。 此功能称为充气。 在函数的末尾,我们需要复制字节以输出。 示例:( 完整代码 ) 在此示例中,我们执行了while循环,通过增加指针来复制字节。 因此,我们有“复制”迭代。 我有一个问题:为什么我们不能仅使用memcpy(put,from,
1回复

我如何使用zlib在C中压缩并在golang中解压缩

因此,我一直在尝试将一些数据从C转换为要压缩的数据,然后发送到golang的库中,在该库中将对其进行解压缩。 唯一的问题是,它们彼此之间的实现似乎略有不同。 我所做的是使用C语言的“ zlib.h”库压缩字符串“ hello”,从而导致字节数 而在golang中,相同的字符串“