首页 > 其他分享 >C语言函数大全-- x 开头的函数(5)

C语言函数大全-- x 开头的函数(5)

时间:2023-05-25 19:32:09浏览次数:30  
标签:函数 -- create C语言 int XDR xdr xdrs

C语言函数大全

本篇介绍C语言函数大全-- x 开头的函数

1. xdrmem_create

1.1 函数说明

函数声明 函数功能
void xdrmem_create(XDR *xdrs, caddr_t addr, u_int size, enum xdr_op op);); 用于创建一个内存 XDR 流,以便进行编码或解码操作

参数:

  • xdrs : 指向 XDR 数据结构的指针,表示要进行编码或解码的数据流
  • addr : 指向空间地址的指针,可用于存储编码或解码数据
  • size : 以字节为单位的空间大小,指定了 addr 指向空间的大小
  • op : 枚举类型 xdr_op,指定流是用于读取还是写入

1.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main(void) 
{
    XDR xdrs;
    char buffer[1024];
    
    // 创建一个写入流
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);
    
    // 将数据按照需要进行序列化
    int value = 42;
    if (!xdr_int(&xdrs, &value)) 
    {
        fprintf(stderr, "Serialization error!\n");
        return 1;
    }
    
    // 完成后释放资源
    xdr_destroy(&xdrs);
    
    return 0;
}

2. xdrmem_destroy

2.1 函数说明

函数声明 函数功能
void xdrmem_destroy(XDR* xdrs); 用于销毁先前创建的 XDR 内存流,释放其相关资源

参数:

  • xdrs : 指向 XDR 结构体的指针

2.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    char buffer[1024];
    XDR xdrs;

    // 创建内存流
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);

    // 将数据写入内存流中
    int val = 123;
    if (!xdr_int(&xdrs, &val)) 
    {
        printf("无法将数据编码到内存流中");
        return -1;
    }

    // 销毁内存流
    xdrmem_destroy(&xdrs);

    return 0;
}

3. xdrrec_create

3.1 函数说明

函数声明 函数功能
bool_t xdrrec_create(XDR *xdrs, u_int sendsize, u_int recvsize, caddr_t tcp_handle, int (*readit)(char *, char *, int), int (*writeit)(char *, char *, int)); 用于创建一个可用于 XDR 编码或解码的 XDR

参数:

  • xdrs : 指向要编码或解码数据的 XDR 结构体的指针
  • sendsize : 无符号整数,指定用于发送数据的缓冲区大小
  • recvsize : 无符号整数,指定用于接收数据的缓冲区大小
  • tcp_handle : 指向传输句柄的指针,表示用于通信的 TCP 连接的句柄
  • readit : 指向从 TCP 连接中读取数据的函数的指针
  • writeit : 指向将数据写入 TCP 连接的函数的指针

3.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

void main()
{
    XDR xdrs;
    u_int sendsize = 1024;
    u_int recvsize = 1024;
    caddr_t tcp_handle = NULL;
    int (*readit)(char *, char *, int) = NULL;
    int (*writeit)(char *, char *, int) = NULL;

    if (!xdrrec_create(&xdrs, sendsize, recvsize, tcp_handle, readit, writeit)) 
    {
        printf("Failed to create XDR stream.\n");
    } 
    else 
    {
        printf("Successfully created XDR stream.\n");
    }
}

在上面的示例代码中,们定义了一个 XDR 结构体和一些用于创建流的参数。然后,我们调用 xdrrec_create() 函数来创建 XDR 流,并根据函数的返回值确定是否成功创建了流。

4. xdrrec_endofrecord

4.1 函数说明

函数声明 函数功能
bool_t xdrrec_endofrecord(XDR *xdrs, bool_t flushnow); 用于在 XDR 流中记录数据的结束处插入分隔符

参数:

  • xdrs : 指向 XDR 的输入流的指针
  • flushnow : 是否立即刷新 XDR 流。如果设置为 非0 值,则在调用此函数时将强制刷新 XDR

返回值:

  • 如果成功设置记录结束标记,则返回 TRUE
  • 否则返回 FALSE

4.2 演示示例

#include <rpc/xdr.h>
#include <stdio.h>

int main()
{
    FILE *fp;
    XDR xdrs;
    char buffer[256];
    int len;

    // 打开文件
    fp = fopen("data.xdr", "wb");
    if(fp == NULL)
    {
        printf("打开文件失败!\n");
        return -1;
    }

    // 创建XDR流
    xdrstdio_create(&xdrs, fp, XDR_ENCODE);

    // 序列化一些数据
    sprintf(buffer, "这是一段文本数据。");
    len = strlen(buffer);
    xdr_bytes(&xdrs, &buffer, &len, 256);

    // 结束记录
    xdrrec_endofrecord(&xdrs, 1);

    // 关闭XDR流和文件
    xdr_destroy(&xdrs);
    fclose(fp);

    return 0;
}

5. xdrrec_eof

5.1 函数说明

函数声明 函数功能
int xdrrec_eof(XDR *xdrs); 用于检查在 XDR 流中是否遇到了文件结束符

参数:

  • xdrs : 指向 XDR 的输入流的指针

返回值:

  • 如果已经读取到了数据流的末尾,则返回 TRUE
  • 否则返回 FALSE

5.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    XDR xdrs;
    char buffer[256];
    int eof;

    // 初始化XDR结构体
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);

    // 写入一些数据到缓冲区
    int i = 123;
    xdr_int(&xdrs, &i);

    // 检查是否到达了EOF
    eof = xdrrec_eof(&xdrs);

    if (eof) 
    {
        printf("已经到达EOF\n");
    } 
    else 
    {
        printf("还没有到达EOF\n");
    }

    return 0;
}

6. xdrrec_readbytes

6.1 函数说明

函数声明 函数功能
bool_t xdrrec_readbytes(XDR *xdrs, caddr_t addr, u_int len); 用于从输入流中读取字节并将其解析为指定的数据类型

参数:

  • xdrs : 指向 XDR 的输入流的指针
  • addr : 指向存储读取的字节序列的缓冲区的指针
  • len : 要读取的字节数

返回值:

  • 如果读取成功,则返回已成功读取的字节数;
  • 如果到达流的末尾,则返回 0
  • 如果发生了错误,则返回 负数【可以使用 perror() 函数来打印有关错误的详细信息,并根据需要进行处理】。

6.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    char buffer[256];
    XDR xdrs;
    xdrstdio_create(&xdrs, stdin, XDR_DECODE);

    if (xdrrec_readbytes(&xdrs, buffer, sizeof(buffer))) 
    {
        printf("Read string: %s\n", buffer);
    } 
    else 
    {
        printf("Failed to read string.\n");
    }

    xdr_destroy(&xdrs);
    return 0;
}

在上述的示例代码中,

  • 首先,我们创建了一个 XDR 输入流,并将其关联到标准输入上;
  • 然后,使用 xdrrec_readbytes() 函数从输入流中读取字符串,并将其存储到 buffer 缓冲区中;
  • 接着,我们检查函数的返回值,如果成功读取字符串,则将其打印到标准输出上;否则,我们会打印错误消息;
  • 最后,我们销毁了 XDR 流并退出程序。

7. xdrrec_skiprecord

7.1 函数说明

函数声明 函数功能
bool_t xdrrec_skiprecord(XDR *xdrs); 用于跳过 XDR 流中的下一个记录

参数:

  • xdrs : 指向要操作的 XDR 数据结构的指针

返回值:

  • 如果返回 -1,则表示发生了错误,可能是由于输入参数无效而导致的。
  • 如果返回 0,则表示函数成功地跳过了当前记录,并且将新纪录的开头设置为下一条记录的字节偏移量。
  • 如果返回 1,则表示到达文件末尾,因此无法跳过更多的记录。

7.2 演示示例

#include <rpc/rpc.h>

int main()
{
    // 创建 XDR 流
    XDR xdrs;
    char buffer[1024];
    xdrmem_create(&xdrs, buffer, sizeof(buffer), XDR_ENCODE);

    // 写入两个记录
    int record1 = 1234;
    int record2 = 5678;
    xdr_int(&xdrs, &record1);
    xdrrec_endofrecord(&xdrs, TRUE);
    xdr_int(&xdrs, &record2);
    xdrrec_endofrecord(&xdrs, TRUE);

    // 打印第一条记录
    printf("Record 1: %d\n", record1);

    // 跳过第二个记录
    xdrrec_skiprecord(&xdrs);

    // 读取第三个记录(不存在)
    int record3 = 0;
    if (xdr_int(&xdrs, &record3)) 
    {
        printf("Record 3: %d\n", record3);
    } 
    else 
    {
        printf("No third record found.\n");
    }

    return 0;
}

8. xdrrec_skipopaque

8.1 函数说明

函数声明 函数功能
bool_t xdrrec_skipopaque(XDR *xdrs, uint32_t cnt); 用于编码或解码空值【void类型】

参数:

  • xdrs : 指向要操作的 XDR 数据结构的指针
  • cnt : 要跳过的不透明数据的字节数

返回值:

  • 如果成功跳过指定的字节数,则返回 TRUE
  • 否则返回 FALSE

8.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

#define MAX_BUF_SIZE 1024

int main() 
{
    char buffer[MAX_BUF_SIZE] = "Hello, world!";
    XDR xdr;
    xdrmem_create(&xdr, buffer, MAX_BUF_SIZE, XDR_ENCODE);

    // 写入字符串到 XDR 流
    if (!xdr_string(&xdr, &buffer, MAX_BUF_SIZE)) 
    {
        fprintf(stderr, "Failed to serialize string.\n");
        return 1;
    }

    // 跳过前 6 个字节
    if (!xdrrec_skipopaque(&xdr, 6)) 
    {
        fprintf(stderr, "Failed to skip bytes.\n");
        return 1;
    }

    // 读取剩下的部分
    char output[MAX_BUF_SIZE];
    if (!xdr_string(&xdr, &output, MAX_BUF_SIZE)) 
    {
        fprintf(stderr, "Failed to deserialize string.\n");
        return 1;
    }

    printf("Result: %s\n", output);  // "world!"

    return 0;
}

9. xdrstdio_create

9.1 函数说明

函数声明 函数功能
XDR *xdrstdio_create(FILE *file, enum xdr_op op); 用于创建一个 XDR 流,并将其与标准输入和输出关联起来

参数:

  • file :XDR 流关联的文件指针
  • op : 指定 XDR 流的操作类型。可选值包括 XDR_ENCODEXDR_DECODEXDR_FREE

返回值:

  • 如果创建成功,则返回一个指向 XDR 结构体的指针;
  • 如果调用失败,则返回 NULL

9.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    FILE *stream;
    XDR *xdrs;
    int i = 1234567890;
    int o;

    stream = fopen("test.xdr", "w");
    if (!stream) 
    {
        perror("fopen failed");
        exit(1);
    }
    
    xdrs = xdrstdio_create(stream, XDR_ENCODE);
    if (!xdrs) 
    {
        fprintf(stderr, "could not create XDR stream\n");
        fclose(stream);
        exit(1);
    }

    if (xdr_int(xdrs, &i) == FALSE) 
    {
        fprintf(stderr, "could not encode integer\n");
        exit(1);
    }

    xdr_destroy(xdrs);

    fclose(stream);

    stream = fopen("test.xdr", "r");
    if (!stream) 
    {
        perror("fopen failed");
        exit(1);
    }

    xdrs = xdrstdio_create(stream, XDR_DECODE);
    if (!xdrs) 
    {
        fprintf(stderr, "could not create XDR stream\n");
        fclose(stream);
        exit(1);
    }

    if (xdr_int(xdrs, &o) == FALSE) 
    {
        fprintf(stderr, "could not decode integer\n");
        exit(1);
    }

    printf("i = %d, o = %d\n", i, o);

    xdr_destroy(xdrs);

    fclose(stream);

    return 0;
}

10. xdrstdio_destroy

10.1 函数说明

函数声明 函数功能
void xdrstdio_destroy(XDR *xdrs); 释放由 xdrstdio_create 创建的 XDR 流所占用的资源

参数:

  • xdrs : 指向要销毁的 XDR 流的指针

10.2 演示示例

#include <stdio.h>
#include <rpc/xdr.h>

int main() 
{
    // 打开文件以供读取/写入
    FILE *file = fopen("data.txt", "w");

    // 创建 XDR 流对象
    XDR xdrs;
    xdrstdio_create(&xdrs, file, XDR_ENCODE);

    // 在这里进行编码操作...

    // 销毁 XDR 流对象
    xdrstdio_destroy(&xdrs);

    // 关闭文件
    fclose(file);

    return 0;
}

11. xdrstdio_getpos

11.1 函数说明

函数声明 函数功能
int xdrstdio_getpos(XDR *xdrs, fpos_t* pos); 用于获取 XDR stream 当前的位置

参数:

  • xdrs : 指向 XDR 结构体的指针,表示正在操作的流
  • pos : 指向 fpos_t 变量的指针,表示将要保存当前位置的变量

返回值:

  • 如果成功获取位置信息,则返回 0
  • 如果出现错误,则返回 非 0

11.2 演示示例

#include <rpc/xdr.h>
#include <stdio.h>

int main()
{
    XDR xdrs;
    FILE *fp;
    fpos_t pos;

    fp = fopen("test.xdr", "rb");
    if (fp == NULL) {
        perror("Cannot open file");
        return -1;
    }

    // 初始化 XDR 流
    xdrstdio_create(&xdrs, fp, XDR_DECODE);

    // 获取当前位置
    if (xdrstdio_getpos(&xdrs, &pos)) {
        perror("Get position failed");
        return -1;
    }
    printf("Current position: %ld\n", (long)pos);

    // do something...

    // 回到之前的位置
    if(fsetpos(fp, &pos)) {
        perror("Set position failed");
        return -1;
    }

    // 销毁 XDR 流
    xdr_destroy(&xdrs);

    fclose(fp);

    return 0;
}

12. xdrstdio_setpos

12.1 函数说明

函数声明 函数功能
int xdrstdio_setpos(XDR *xdrs, int pos); 设置由 xdrs 指向的 XDR 流的当前位置

参数:

  • xdrs : 指向将要被调整位置的 XDR 流的指针
  • pos : 新位置的偏移量

返回值:

  • 如果成功设置位置信息,则返回 0
  • 如果出现错误,则返回 非 0

12.2 演示示例

#include <rpc/xdr.h>
#include <stdio.h>

int main() 
{
    XDR xdrs;
    FILE *f = fopen("data.xdr", "r");
    xdrstdio_create(&xdrs, f, XDR_DECODE);

    // 记录当前位置
    int old_pos = xdr_getpos(&xdrs);

    // 将位置调整到第二个元素开始
    xdrstdio_setpos(&xdrs, old_pos + sizeof(int));

    int b;
    if (!xdr_int(&xdrs, &b)) 
    {
        fprintf(stderr, "Failed to decode second element.\n");
        exit(1);
    }
    printf("Second element: %d\n", b);

    xdr_destroy(&xdrs);
    fclose(f);
    return 0;
}

标签:函数,--,create,C语言,int,XDR,xdr,xdrs
From: https://blog.51cto.com/huazie/6350816

相关文章

  • error CS0246: The type or namespace name ‘NetworkManager‘ could not be found
    项目场景:之前用Unity5.x开发的项目,要升级到Unity2019问题描述:因为项目中用到了老版的Network导致升级后报错errorCS0246:Thetypeornamespacename'NetworkManager'couldnotbefound(areyoumissingausingdirectiveoranassemblyreference?)<hrstyle="border:s......
  • 北森iTalentX7.0: AI教练到来,掀起一场新的HR软件变革
    5月25日,“HRSaaS未来势”2023北森春季产品发布会上,北森提出人力资源软件的未来十年,将从“为HR而设计”走向“为员工而设计”,北森正式发布iTalentX7.0—业人一体,为员工而设计。北森CEO纪伟国认为:传统HR软件主要围绕HR部门的工作场景而设计,目标是提升HR的工作和管理效率。这一次发布......
  • 执行一条update会发生什么?
    1、和查询语句一样也会走一遍连接器、解析器、预处理器、优化器、执行器 2、执行器在更新数据前,会先查看bufferpool中是否存在要更新的数据,如果不存在则从磁盘加载到bufferpool,存在则进行修改 3、innodb把旧值写入undolog 4、innodb把新值写到bufferpool 5、innod......
  • STM32 HAL开发完全指南
    关于STM32IAP升级之为什么APP执行要&0x2FFE0000这个数值的原因嵌入式软件开发​CarrollUniversity工商管理硕士 10人赞同了该文章如下图所示,这是我目前用的一款CPU:STM32F446RET6,大小是512KB我的bootloader编译完以后占用了26KB的FLASH内存。......
  • 编译静态库遇到的 LNK2019 报错
    前文提到了CMake学习文末基本涵盖了我遇到的编译问题,但是在得到一个编译好的.lib文件后,还需要放到项目中引用成功后才算真正的完成静态库的编译嗯,我之所以说这些是因为我在项目中链接静态库时出现了LNK2019经典错误错误如下:Libraryd.lib(at_exit.obj):errorLNK2019:......
  • CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none
    报错信息:cURLerror77:errorsettingcertificateverifylocations: CAfile:/etc/ssl/certs/ca-certificates.crtCApath:none  ln-s/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt/etc/ssl/certs/ca-certificates.crt......
  • Sentry项目接入规范
    介绍Sentry是一个实时事件日志记录和汇集的平台。其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈。它分为客户端和服务端,客户端(目前客户端有C#,Python,PHP,JavaScript,Ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服......
  • 打卡22
    #include<iostream>usingnamespacestd;classHorse{public:Horse(){cout<<"Horse申请了空间..."<<endl;}virtualvoidFly(){cout<<"Justahorse."<<endl;}virtual~Hors......
  • 学生成绩管理系统中[考场记录]佐证功能有效地减少学生和学校之间的矛盾。
    每学期考试结束后,大量的成绩需要人工录入到学生的成绩系统。经常会出现,考试成绩公布后,或者毕业前,部分学生对自己的成绩不满意,出现各种争议。有些错误是成绩录入人工错误,有些属于卷子丢失错误,有些是学生自己错误,或者缺考,或者未到场签字,或者是考场作弊,成绩为0,或者是否补考费未交等......
  • 将真分数分解为埃及分数
    现输入一个真分数,请将该分数分解为埃及分数。#include<iostream>usingnamespacestd;intmain(){ inta,b,c; cout<<"请分别输入一个真分数的分母和分子:"<<endl; cin>>a>>b; cout<<"分解成埃及分数为:"; while(1) { if(b%a) { c=b/a+1; } else { c=b......