nob*_*bar 1 posix eof posix-api
在POSIX API中,read()返回0表示已到达文件结尾.为什么没有一个单独的函数告诉你read()将返回零 - 而不需要你实际调用read()?
询问的原因:由于你必须打电话read()才能发现它会失败,这使得文件读取算法更加复杂,效率可能略低,因为它们必须分配可能不需要的目标缓冲区.
我们可能想做什么......
while ( !eof )
{
allocate buffer
read to buffer
process buffer
}
Run Code Online (Sandbox Code Playgroud)
我们要做的是......
while ( true )
{
allocate buffer
read to buffer
if ( eof ) release buffer, break;
process buffer
}
Run Code Online (Sandbox Code Playgroud)
此外,它似乎像这种行为本身传播到更高级别的API,如fread()和feof()用C -而且创造了很多关于如何使用混乱的feof()正确:
要了解为什么会出现这种情况,请了解流末端本身并非永久性情况.文件的读指针可能在末尾,但如果随后通过写操作追加更多数据,则后续读取将成功.
示例:在Linux中,从控制台读取时,后面跟着的新行将^D导致posix::read()返回零(表示"文件结束").但是,如果程序没有终止,程序可以继续读取(假设输入了其他行).
由于end-of-stream不是永久性的情况,或许甚至没有is_at_end()函数(POSIX没有)也是有意义的.不幸的是,这确实给程序员(和/或包装器库)带来了额外的负担,以优雅和有效地处理这种复杂性.