【发布时间】:2021-02-14 16:47:57
【问题描述】:
在“C 编程语言”中,作者添加了这段代码:
#define putc(c, p) (--(p->cnt) >= 0) ? \
(*p->ptr++ = c) : _flushbuf(c, p)
但我不明白为什么我必须减少cnt。增加它是不是不合逻辑(因为我们多了一个字符)?
【问题讨论】:
在“C 编程语言”中,作者添加了这段代码:
#define putc(c, p) (--(p->cnt) >= 0) ? \
(*p->ptr++ = c) : _flushbuf(c, p)
但我不明白为什么我必须减少cnt。增加它是不是不合逻辑(因为我们多了一个字符)?
【问题讨论】:
在p->ptr++之后,p->ptr向前移动了一步,所以p->cnt相应地减少了。如果p->cnt不维护,p->ptr会被字符填充,然后溢出。
【讨论】:
p->ptr 和p->cnt。
根据上一页struct _iobuf 定义中的注释,_cnt 成员用于计算缓冲区中的“剩余字符数”。对于输出流,这意味着缓冲区中剩余空间的字节数。因此,当您向缓冲区添加另一个字符时,可用空间会减少一个字符。
对于getc,这对输入流有意义,_cnt 改为计算缓冲区中剩余的数据的字符数。
如果您尝试将同一流上的 getc 和 putc 调用与非空缓冲区混合使用,则此实现将不起作用。但是,C 要求您在读取和写入之间调用 fflush,这样可以避免该问题。
【讨论】: