在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,例如C中的fread()
和feof()
,并且会对如何正确使用feof()
产生很多疑惑:
答案 0 :(得分:6)
要了解可能出现这种情况的原因,请了解流结束本身并非永久性情况。文件的读指针可能在最后,但如果随后通过写操作追加更多数据,则后续读取将成功。
示例:在Linux中,从控制台读取时,后跟^D
的新行将导致posix::read()
返回零(表示“文件结束”)。但是,如果程序没有终止,程序可以继续读取(假设输入了其他行)。
由于end-of-stream不是永久性的情况,或许甚至没有is_at_end()函数(POSIX没有)也是有意义的。不幸的是,这确实给程序员(和/或包装器库)带来了额外的负担,以优雅和有效地处理这种复杂性。
答案 1 :(得分:0)
一般情况是程序的输入总字节数将超过零。因此,在一般情况下,程序必须分配缓冲区。没有空输入的特殊情况更简单。