1

在 POSIX API 中,read()返回 0 表示已到达文件结尾。为什么没有一个单独的函数告诉你read()返回零——而不需要你实际调用read()


询问的原因:由于您必须调用read()才能发现它会失败,这使得文件读取算法更加复杂并且效率可能稍低,因为它们必须分配可能不需要的目标缓冲区。

我们可能想做的事...

while ( !eof )
   {
   allocate buffer
   read to buffer
   process buffer
   }

相反,我们必须做的...

while ( true )
   {
   allocate buffer
   read to buffer
   if ( eof ) release buffer, break;
   process buffer
   }

此外,这种行为似乎会传播到更高级别的 API 中,例如Cfread()feof()C 中 - 并且在如何feof()正确使用方面造成了很多混乱:

4

1 回答 1

6

要了解为什么会出现这种情况,请了解流结束本质上并不是永久性的情况。文件的读取指针可能位于末尾,但如果随后写入操作附加了更多数据,则后续读取将成功。

示例:在 Linux 中,从控制台读取时,后跟新行将^D导致posix::read()返回零(表示“文件结束”)。但是,如果程序没有终止,程序可以继续阅读(假设输入了额外的行)。

由于流结束不是永久性情况,因此甚至没有 is_at_end() 函数(POSIX 没有)也许是有意义的。不幸的是,这确实给程序员(和/或包装库)带来了一些额外的负担,以优雅而有效地处理这种复杂性。

于 2013-07-07T00:26:12.550 回答