小编Tho*_*her的帖子

了解K&R的putc宏:K&R第8章(Unix系统接口)练习2

我一直试图了解K&R的putc版本已经有一段时间了,而且我已经没有资源了(谷歌,堆栈溢出,clcwiki没有我想要的东西,我没有朋友或同事转过来至).我先解释一下背景,然后要求澄清.

本章的这一章介绍了描述文件的数据结构示例.该结构包括用于一次读取和写入大块的字符缓冲区.然后他们要求读者写一个标准库putc的版本.

作为读者的线索,K&R编写了一个支持缓冲和无缓冲读取的getc版本.他们还编写了putc宏的骨架,让用户自己编写函数_flushbuf().putc宏看起来像这样(p是指向文件结构的指针):

int _flushbuf(int, FILE *);
#define putc(x,p)        (--(p)->cnt >= 0 \ 
                       ? *(p)->ptr++ = (x) : _flushbuf((x),p)
typedef struct {
        int   cnt;  /*characters left*/
        char *ptr;  /*next character position*/
        char *base; /*location of buffer*/
        int   flag; /*mode of file access*/
        int   fd;   /*file descriptor*/
} FILE;
Run Code Online (Sandbox Code Playgroud)

令人困惑的是,宏中的条件实际上是测试结构的缓冲区是否已满(这在文中说明) - 作为旁注,getc中的条件完全相同但意味着缓冲区为空.奇怪的?

这是我需要澄清的地方:我认为putc中的缓冲写入存在一个相当大的问题; 因为写入p只在_flushbuf()中执行,但_flushbuf()仅在文件结构的缓冲区已满时调用,然后只有在缓冲区完全填满时才进行写入.缓冲读数的大小始终是系统的BUFSIZ.除了'BUFSIZ'字符之外的任何其他内容都不会发生,因为_flushbuf()永远不会在putc中调用.

putc适用于无缓冲写入.但是宏的设计使得缓冲写入几乎完全没有意义.这是正确的,还是我在这里遗漏了什么?为什么会这样?我非常感谢这里的所有帮助.

c macros file-writing

4
推荐指数
2
解决办法
121
查看次数

标签 统计

c ×1

file-writing ×1

macros ×1