为什么POSIX API没有文件结束功能?

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()正确:

nob*_*bar 6

要了解为什么会出现这种情况,请了解流末端本身并非永久性情况.文件的读指针可能在末尾,但如果随后通过写操作追加更多数据,则后续读取将成功.

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

由于end-of-stream不是永久性的情况,或许甚至没有is_at_end()函数(POSIX没有)也是有意义的.不幸的是,这确实给程序员(和/或包装器库)带来了额外的负担,以优雅和有效地处理这种复杂性.