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

时间:2012-01-14 03:24:34

标签: posix eof posix-api

在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()产生很多疑惑:

2 个答案:

答案 0 :(得分:6)

要了解可能出现这种情况的原因,请了解流结束本身并非永久性情况。文件的读指针可能在最后,但如果随后通过写操作追加更多数据,则后续读取将成功。

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

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

答案 1 :(得分:0)

一般情况是程序的输入总字节数将超过零。因此,在一般情况下,程序必须分配缓冲区。没有空输入的特殊情况更简单。