C语言函数大全-- z 开头的函数

这篇具有很好参考价值的文章主要介绍了C语言函数大全-- z 开头的函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. zalloc

1.1 函数说明

函数声明 函数功能
voidpf zalloc (voidpf opaque, uInt items, uInt size); 它 是 zlib 库中的函数之一,用于动态分配内存并返回指向已分配内存的指针。它使用了 zlib 中的内存管理器,并支持在压缩时自定义内存管理函数

参数:

  • opaque : 传递给 zlib 内存管理器的不透明指针,可以为 NULL
  • items : 请求分配的元素数量
  • size : 每个元素的大小

返回值:

  • 如果分配成功,则返回已分配内存的指针;
  • 如果分配失败,则返回 NULL

1.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main() 
{
	// 分配了 10 个整数大小的内存
    void *ptr = zalloc(NULL, 10, sizeof(int));
    if (ptr == NULL) 
    {
        printf("Failed to allocate memory.\n");
        exit(-1);
    }
    int *p = (int*) ptr;
    for (int i = 0; i < 10; i++) 
    {
        p[i] = i;
    }
    for (int i = 0; i < 10; i++) 
    {
        printf("%d ", p[i]);
    }
    printf("\n");
	// 释放上述分配的内存
    free(ptr);
    return 0;
}

2. zcalloc

2.1 函数说明

函数声明 函数功能
voidpf zcalloc (voidpf opaque, unsigned items, unsigned size); 它是 zlib 库的内存分配器,用于分配 items * size 字节大小的连续内存空间,该内存空间初始值为零。同时它还支持指定 opaque 参数作为可选的透明指针,以便在内存分配时使用。

参数:

  • opaque : 指向任意类型的指针,表示可选的、不透明的指针,如果没有特殊需求,可以设置为 NULL
  • items : 无符号整型,表示要分配的元素个数
  • size : 无符号整型,表示每个元素占用的字节数

返回值:

  • 如果分配成功,则返回指向分配内存起始地址的指针;
  • 如果分配失败,则返回 NULL

2.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main()
{
    void *ptr;
    unsigned int items = 100;
    unsigned int size = sizeof(int);
    
    // 分配 100 个 int 类型的内存空间,并初始化为零
    ptr = zcalloc(NULL, items, size);
    
    if (ptr != NULL)
    {
        printf("Memory allocation successful!\n");
        // do something with the allocated memory
        
        // 释放内存空间
        zcfree(ptr);
    }
    else
    {
        printf("Memory allocation failed!\n");
    }

    return 0;
}

3. zcfree

3.1 函数说明

函数声明 函数功能
void zcfree(void *ptr); 它是 Zlib 库中的一个函数,用于释放 zcalloc() 分配的内存空间

参数:

  • ptr: 指向要释放的内存空间的指针

3.2 演示示例

详见 2.2 中 演示示例

4. zclearerr

4.1 函数说明

函数声明 函数功能
void zclearerr(z_stream *stream); 它是 zlib 库中的一个函数,它用于清除 z_stream 结构体中的错误标志和结束标志,以便重新使用该结构体来进行数据压缩或解压缩

参数:

  • stream: 一个指向 z_stream 结构体的指针作为参数,包含了进行数据压缩或解压缩时所需的所有信息

4.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"

#define CHUNK_SIZE 1024

int main()
{
    gzFile file;
    char buffer[CHUNK_SIZE];
    int bytes_read;

    if (argc != 2) 
    {
        fprintf(stderr, "Usage: %s file.gz\n", argv[0]);
        exit(1);
    }

    file = gzopen(argv[1], "rb");
    if (!file) 
    {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }

    // Read the first chunk of data from the file.
    bytes_read = gzread(file, buffer, CHUNK_SIZE);

    while (bytes_read > 0) 
    {
        // Process the data...
        
        // Clear the error state before reading the next chunk.
        zclearerr(file);
        
        // Read the next chunk of data from the file.
        bytes_read = gzread(file, buffer, CHUNK_SIZE);
    }

    if (bytes_read < 0) 
    {
        fprintf(stderr, "Error reading file %s: %s\n", argv[1], gzerror(file, NULL));
        exit(1);
    }

    gzclose(file);

    return 0;
}

在上面的示例代码中,演示了使用 zlib 库来读取 gzip 压缩文件中的数据:

  • 首先,程序会检查命令行参数是否正确,如果不正确,则输出使用方法并退出程序。
  • 然后,程序会使用 gzopen() 函数打开指定的 gzip 文件,并将返回的文件指针保存在 file 变量中。如果文件打开失败,则输出错误信息并退出程序。
  • 接着,程序会循环读取文件中的数据,每次读取 CHUNK_SIZE 大小的数据到 buffer 数组中。当读取到文件末尾时,gzread() 函数会返回 0,此时循环结束。如果读取过程中出现错误,例如文件损坏或者压缩格式不正确,那么 gzread() 函数会返回负数,表示出错了。

    注意: 在每次读取完数据之后,程序需要处理读取到的数据。具体的处理方式根据实际应用而定,这里没有给出相应的代码。如果需要读取更多的数据,程序需要调用 zclearerr 函数来清除可能存在的错误状态,并再次调用 gzread 函数来读取数据。

  • 最后,调用 gzclose() 函数关闭文件并释放资源,然后返回 0 表示程序正常结束。如果读取文件过程中出现错误,则输出错误信息并返回 1 表示程序异常结束。

5. zError

5.1 函数说明

函数声明 函数功能
const char *zError(int err); 用于返回与给定错误代码对应的错误信息字符串

参数:

  • err : 错误码
    • 如果 err 的取值为 Z_OK 时,该函数将返回 "ok"
    • 如果 err 的值为 Z_STREAM_END,该函数将返回 "stream end"
    • 如果 err 的取值为 Z_MEM_ERROR 时,该函数会返回 "out of memory",表示内存不足;
    • 如果 err 的取值为 Z_BUF_ERROR 时,该函数会返回 "buffer error",表示缓冲区出错。

5.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zlib.h"

#define CHUNK 1024

int main() 
{
    char *source = "Hello, world!";
    size_t sourceLen = strlen(source) + 1;

    printf("Source: %s\n", source);

    // 压缩数据
    uLongf destLen = compressBound(sourceLen);
    Bytef *dest = (Bytef *)malloc(destLen);
    int res = compress(dest, &destLen, (const Bytef*)source, sourceLen);

    if (res != Z_OK) 
    {
        printf("Error during compression: %s\n", zError(res));
        return 1;
    }

    printf("Compressed: ");
    for (uLongf i = 0; i < destLen; i++) 
    {
        printf("%02x ", dest[i]);
    }
    printf("\n");

    // 解压数据
    char *uncompressed = (char *)malloc(sourceLen);
    res = uncompress((Bytef*)uncompressed, &sourceLen, dest, destLen);

    if (res != Z_OK) 
    {
        printf("Error during decompression: %s\n", zError(res));
        return 1;
    }

    printf("Uncompressed: %s\n", uncompressed);

    free(dest);
    free(uncompressed);
    return 0;
}

在上述的示例代码中,文章来源地址https://www.toymoban.com/news/detail-469808.html

  • 首先,定义了一个字符串"Hello, world!",并计算其长度;
  • 然后,使用 compressBound() 函数计算需要分配的 dest 缓冲区的大小,并使用 malloc() 函数动态分配内存;
  • 接着,调用 compress() 函数对源数据进行压缩,将压缩结果存储到dest缓冲区中,并检查是否出现了错误;
  • 再然后,输出压缩结果的十六进制表示;
  • 再接着,使用 malloc() 函数再次动态分配内存以存储解压后的数据,并调用 uncompress() 函数进行解压缩,并检查是否出现了错误;
  • 最后,输出解压后的字符串,并释放动态分配的内存。

6. zlibVersion

6.1 函数说明

函数声明 函数功能
const char* zlibVersion(void); 获取当前Zlib版本号

6.2 演示示例

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

int main()
{
    const char *version = zlibVersion();
    printf("Zlib version: %s\n", version);
    return 0;
}

到了这里,关于C语言函数大全-- z 开头的函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言函数大全-- s 开头的函数(1)

    本篇介绍C语言函数大全-- s 开头的函数(1) 函数声明 函数功能 void *sbrk(intptr_t increment); 它是一个 Unix 系统的函数,用于调整程序的堆空间。 参数: increment : 增加的堆空间的大小 返回值: 如果调用成功,返回值即为增加空间前的原始堆顶指针; 如果出错,则返回 (void *

    2024年02月01日
    浏览(48)
  • C语言函数大全-- s 开头的函数(3)

    本篇介绍C语言函数大全-- s 开头的函数(3) 函数声明 函数功能 unsigned int sleep(unsigned int seconds); 它是 C 语言标准库中的函数,用于使当前进程挂起一定的时间。在挂起期间,操作系统会将该进程从调度队列中移除,直到指定的时间过去为止。 void Sleep(DWORD milliseconds); 它是 W

    2024年02月02日
    浏览(56)
  • Vue2技能树(3)-声明式渲染、指令大全、生命周期函数

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! Vue2技能树(1)-介绍、导入使用、响应式数据绑定、组件化开发 vue2技能树(2)-模板语法、vue的工具链、渐进式框架 Vue2技能树(3)-声明式渲染、指令大全、生命周

    2024年02月07日
    浏览(51)
  • C语言函数声明以及函数原型

    所谓声明(Declaration),就是告诉编译器我要使用这个函数; 函数声明的格式,是去掉函数定义中的函数体,并在最后加上分号; 也可以不写形参,只写数据类型: dataType  functionName( dataType1, dataType2 ... ); 函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等

    2024年02月01日
    浏览(42)
  • 使用C语言自定义头文件,声明的变量或者函数用extern和不同extern修饰有什么区别?

    在C语言中,当在头文件中声明变量或函数时,使用 extern 和不使用 extern 修饰有以下区别: 使用 extern 修饰变量: extern 修饰的变量只是声明,不分配存储空间。它表示该变量的定义在其他源文件中,需要在使用该变量的源文件中进行定义和分配存储空间。 不使用 extern 修饰的

    2024年02月10日
    浏览(49)
  • 【C语言进阶】最常用的库函数大全——从入门到精通

    前言: 一.字符串函数 1.strlen——求字符串长度 strlen 2.长度不受限制的字符串函数 a.strcpy——字符串拷贝 strcpy  b.strcat——追加字符串 strcat  c.strcmp——字符串比较 strcmp 3.长度受限制的字符串函数——strncpy,strncat,strncmp 为什么会出现这些函数呢? strncpy函数: strncpy strncat函数

    2024年02月03日
    浏览(58)
  • TypeScript 中的常用类型声明大全

    上一章节,我们介绍了什么是TS,以及TS的应用场景。本章节将给大家介绍,在TypeScript 中,常用的数据类型声明,有我们熟悉的 基本数据类型,也有,一些TypeScript 新增的一些,语法规范类型。出发吧… 函数:同样的,也可以给函数限制 接受形参的类型和,限制返回值的数

    2024年02月16日
    浏览(38)
  • 【不良人】官方声明:天罡传电影拍摄三部,第七季仅一句话说明

    Hello,小伙伴们, 我是小郑继续为大家深度解析画江湖系列! 距离画江湖之不良人第六季完结已经有一段时间了,就在小郑都快忘了这部动漫的时候,突然官方发声了。 先是透露了关于画江湖之不良人番外电影天罡传的情报,之后又明确表示了天罡传第一部电影何时上线。

    2024年02月10日
    浏览(30)
  • 【C++】友元函数 ( 友元函数简介 | 友元函数声明 | 友元函数语法 | 友元函数声明不受访问控制限制 | 友元函数参数要求 )

    在 C++ 语言中 , \\\" 友元函数 \\\" 是 与 类 相关联的函数 , \\\" 友元函数 \\\" 不是类的成员函数 , 但是可以访问类的 private 私有成员 和 protected 保护成员 ; 友元函数可以是 全局函数 本类的成员函数 其他类的成员函数 友元函数 是 类的 朋友 , 在 友元函数 中 , 可以修改 类对象 中的 私有

    2024年01月20日
    浏览(44)
  • python命令大全及说明文档,python命令大全及效果

    这篇文章主要介绍了python命令大全及说明文档,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。        刚开始学习一门语言方法很重要,下面是一些非常实用的方法总结,站在巨人的肩膀上才能成长的

    2024年03月17日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包