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_ENCODE
、XDR_DECODE
和XDR_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