我想我在K& R(第二版)中发现了一个新的错误。
在第164页,写着" feof"如果"文件末尾"则返回非零;已经发生了。
在第170页,写着" read"到达"文件末尾"。
在第176 K&R页上,写了" feof"的定义。
在第178 K&R页,我认为在" _fillbuf"的定义中用红色下划线标出了两个条件。应该是相反的。
我是对的吗?
答案 0 :(得分:8)
我同意Bjorn A的comment和lurker的comment - 我认为代码没有问题。
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->cnt
从0
递减到-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第二版中的代码是正确的 - 您还没有找到以前未报告的错误。