【问题标题】:Why I have to decrease cnt in putc function? I have one more character. Is it not logical to increase it?为什么我必须减少 putc 函数中的cnt?我还有一个角色。增加它不符合逻辑吗?
【发布时间】:2021-02-14 16:47:57
【问题描述】:

在“C 编程语言”中,作者添加了这段代码:

#define putc(c, p) (--(p->cnt) >= 0) ? \
            (*p->ptr++ = c) : _flushbuf(c, p)

但我不明白为什么我必须减少cnt。增加它是不是不合逻辑(因为我们多了一个字符)?

【问题讨论】:

    标签: c macros


    【解决方案1】:

    p->ptr++之后,p->ptr向前移动了一步,所以p->cnt相应地减少了。如果p->cnt不维护,p->ptr会被字符填充,然后溢出。

    【讨论】:

    • 我明白了。那么,当ptr在缓冲区末尾时,flushbuf()将所有缓冲区数据(更改)放回文件中?
    • @AbdulAxundzade 我还没有读过这本书,但我想应该可以。而且它还会重置p->ptrp->cnt
    【解决方案2】:

    根据上一页struct _iobuf 定义中的注释,_cnt 成员用于计算缓冲区中的“剩余字符数”。对于输出流,这意味着缓冲区中剩余空间的字节数。因此,当您向缓冲区添加另一个字符时,可用空间会减少一个字符。

    对于getc,这对输入流有意义,_cnt 改为计算缓冲区中剩余的数据的字符数。

    如果您尝试将同一流上的 getcputc 调用与非空缓冲区混合使用,则此实现将不起作用。但是,C 要求您在读取和写入之间调用 fflush,这样可以避免该问题。

    【讨论】:

    • 那么,为什么我们在getc中做同样的操作呢?这些功能是相反的
    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多