K& R(第二版)中可能出现的新错误并未出现在任何勘误中?

时间:2017-07-29 17:57:46

标签: c

我想我在K& R(第二版)中发现了一个新的错误。

  • 在第164页,写着" feof"如果"文件末尾"则返回非零;已经发生了。

  • 在第170页,写着" read"到达"文件末尾"。

  • 时返回0
  • 在第176 K&R页上,写了" feof"的定义。

  • 在第178 K&R页,我认为在" _fillbuf"的定义中用红色下划线标出了两个条件。应该是相反的。

我是对的吗?

1 个答案:

答案 0 :(得分:8)

我同意Bjorn Acommentlurkercomment - 我认为代码没有问题。

p164上feof()的规范对应于C标准所说的内容 - 虽然我已经链接到POSIX规范,但它的目的是匹配C标准。规范说read()返回0表示EOF;如果它返回-1,则出现错误而不是简单的EOF。这是无争议的。

请注意,p176上的内容是{em> feof()的实现;它是 feof()实现。还有其他一些实现与此实现细节不同,尽管最终结果非常相似。

#define feof(p)  (((p)->flag & _EOF) != 0)

这个宏是无可挑剔的;如果在标志中设置1位,则返回_EOF,否则返回0 - 符合预期(要求)。

在p178上留下了_fillbuf()的示例实现。相关代码是:

fp->cnt = read(fp->fd, fp->ptr, bufsize);
if (--fp->cnt < 0) {
    if (fp->cnt == -1)
        fp->flag |= _EOF;
    else
        fp->flag |= _ERR;
    fp->cnt = 0;
    return EOF;
}
return (unsigned char)*fp->ptr++;

有三种情况需要考虑:

  • read()返回正数
  • read()返回零
  • read()返回负数

在第一种情况下,代码递减fp->cnt,它至少为0,因此执行最终返回;返回一个字符,正确转换为unsigned char以确保该值为正。

在第二种情况下(EOF处理),代码将fp->cnt0递减到-1,并输入外if语句的正文。由于fp->cnt目前为-1,因此会将_EOF中的fp->flag位设置为0,并将计数返回到零并报告EOF。这是正确的。

在第三种情况下(错误处理),代码将fp->cnt-1递减到-2,并输入外部if语句的正文。由于fp->cnt不是-1,因此会将_ERR中的fp->flag位设置为0,并将计数返回到零并报告EOF。这也是正确的。

因此,K&amp; R第二版中的代码是正确的 - 您还没有找到以前未报告的错误。