【发布时间】:2012-01-14 03:24:33
【问题描述】:
在 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() 方面造成很多混乱:
【问题讨论】:
-
我见过的最有趣的答案(类似问题):stackoverflow.com/a/5605161/86967。需要考虑类似的逻辑是否适用于 POSIX API。
-
输入流大小是缓冲区大小的精确倍数的情况通常很少见。因此,在典型场景下,流结束并不是特别有用。我不记得确切,但是当我问这个问题时,我可能一直在处理流由非常特定大小的数据包/块组成的情况(这也足够大以至于很重要) .