在'C Programming Language'中,作者添加了这段代码:
#define putc(c, p) (--(p->cnt) >= 0) ?
(*p->ptr++ = c) : _flushbuf(c, p)
但是我不明白为什么我必须减少碳排放。增加它是否不合逻辑(因为我们多了一个字符)?
在p->ptr++
之后,p->ptr
向前移动一步,因此p->cnt
减小。如果不维护p->cnt
,则p->ptr
将被字符填充,然后溢出。
_cnt
成员用于计算"左字符数"。在缓冲区中,根据前页struct _iobuf
定义中的注释。对于输出流,这意味着缓冲区中剩余的空间字节数。因此,当您向缓冲区中添加另一个字符时,可用空间就少了一个字符。
对于getc
来说,这对输入流是有意义的,而_cnt
则计算缓冲区中数据的剩余字符数。
如果您试图在具有非空缓冲区的同一流上混合getc
和putc
调用,则此实现将不起作用。但是,C语言要求在读写之间调用fflush
,这样可以避免这个问题。