gpt4 book ai didi

c - 使用 bread 返回一个 bstring

转载 作者:太空狗 更新时间:2023-10-29 15:59:01 25 4
gpt4 key购买 nike

我正在维护某人的代码,如下所示:

FILE *db_fp = NULL;
bstring data = NULL;

db_fp = db_open(DB_FILE, "r");
LOG_CHECK(db_fp == NULL, "Failed to open database: %s", DB_FILE);

data = bread((bNread)fread, db_fp);
LOG_CHECK(data == NULL, "Failed to read from db file: %s", DB_FILE);

db_close(db_fp);

return data;

我在理解以下行时遇到了一些困难:

data = bread((bNread)fread, db_fp);

我能猜到的是,它正在从以下文件指针中获取一个 bstream 并返回一个 bstring。不过,我想知道面包和面包。

bread 包含 2 个参数,一个函数指针 (bNread) 和一个文件指针。但我不确定我是否理解它是如何工作的。

最佳答案

Better String Library 文档中 bread() 的声明是:

typedef size_t (*bNread)(void *buff, size_t elsize, size_t nelem, void *parm);
extern bstring bread(bNread readPtr, void *parm);

因此,bread() 是一个将指向函数的指针作为参数的函数。 bNread 类型用于指定函数的类型。 fread() 函数非常接近,可以在强制转换时通过测试——匹配不准确,因为它需要一个 FILE * 作为它的第四个参数和一个真正的函数bNread 指向的类型需要一个 void *bread 的第二个参数是作为第四个参数传递给 bNread 指向的函数的值。

因此,在您维护的代码中:

data = bread((bNread)fread, db_fp);

Better String Library 函数以 fread() 作为 I/O 函数调用,转换为正确的类型以平息编译器关于类型不匹配的合理警告,以及文件流应该用于阅读。


bread() 函数的实现在需要执行 I/O 以读取字符串时使用函数指针和流指针。也就是说,正如 KerrekB 还解释的那样,代码可能会这样写:

char buffer[256];

size_t nbytes = (*readPtr)(buffer, sizeof(char), sizeof(buffer), parm);

或(等价地):

size_t nbytes = readPtr(buffer, sizeof(char), sizeof(buffer), parm);

(如果您很久以前就学习了 C,那么第一种是通过指向函数的指针调用函数的唯一方法;自从 C89 标准产生以来,第二种已经可用并且现在可能使用得更广泛。)有实现必须担心的一些技巧,但基本函数调用有些相似。代码可以使用 fread() 以外的 I/O 函数,尽管函数的接口(interface)必须相似。

指向函数的指针功能强大,但在您使用它们之前是神秘的。

关于c - 使用 bread 返回一个 bstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13441974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com