使用面包返回bstring

ant*_*009 3 c file-io

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

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;
Run Code Online (Sandbox Code Playgroud)

我在理解以下内容时遇到一些麻烦:

data = bread((bNread)fread, db_fp);
Run Code Online (Sandbox Code Playgroud)

我可以猜到,它是从以下文件指针获取bstream并返回bstring.但是,我想知道面包和畏惧.

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

Jon*_*ler 5

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

typedef size_t (*bNread)(void *buff, size_t elsize, size_t nelem, void *parm);
extern bstring bread(bNread readPtr, void *parm);
Run Code Online (Sandbox Code Playgroud)

因此,bread()是一个将函数指针作为参数的函数.该bNread类型用于指定函数的类型.该fread()函数足够接近以在强制转换时传递 - 匹配不准确,因为它期望FILE *第四个参数和一个bNread期望a 指向的类型的真实函数void *.第二个参数bread是要作为第四个参数传递给函数指向的函数的值bNread.

所以,在你维护的代码中:

data = bread((bNread)fread, db_fp);
Run Code Online (Sandbox Code Playgroud)

使用更好的字符串库函数fread()作为I/O函数,强制转换为正确的类型以平息关于类型不匹配的其他合理的编译器警告,以及应该用于读取的文件流.


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

char buffer[256];

size_t nbytes = (*readPtr)(buffer, sizeof(char), sizeof(buffer), parm);
Run Code Online (Sandbox Code Playgroud)

或(等效地):

size_t nbytes = readPtr(buffer, sizeof(char), sizeof(buffer), parm);
Run Code Online (Sandbox Code Playgroud)

(如果你在很久以前学过C,那么第一种是通过指向函数调用函数的唯一方法;因为生成了C89标准,所以第二种已经可用,并且可能现在使用得更广泛了.)有很多实现必须担心的技巧,但基本函数调用会有些类似.代码可以使用除I/O之外的函数fread(),尽管函数的接口必须类似.

功能指针很强大,但在你使用它们之前是神秘的.