【发布时间】:2020-08-27 18:04:56
【问题描述】:
SO的好人!
我有一个理论问题。
在read() 联机帮助页中,我阅读了以下内容:
On error, -1 is returned, and errno is set appropriately. In this
case, it is left unspecified whether the file position (if any)
changes.
而在fread() 中对应的片段如下:
If an error occurs, or the end of the file is
reached, the return value is a short item count (or zero).
...
**fread()** does not distinguish between end-of-file and error, and
callers must use feof(3) and ferror(3) to determine which occurred.
我的问题 - read() 区分 EOF 和错误,而 fread() 不区分,有什么实际原因吗?
提前谢谢你!
【问题讨论】:
-
接口在不同时期演变,可能由不同的实现者演变。
-
@tadman - 我仍然习惯于标准库可能会因为“只是因为”而不是某些策划者的计划而出现问题。
-
其中许多都是当时有意义的设计决策。当 C 在 1972 年问世时,计算机的资源极其有限,例如 千字节 的内存被认为是奢侈的,而 兆字节 的内存仍然遥不可及。随着后来的计算机增加了更多功能,通过
fread进行缓冲读取之类的事情变得有意义,但这是在read已经建立之后很久。 -
我认为 Barmar 对“为什么”的技术细节有很好的解释,但在更一般的层面上,您需要记住,并非每个功能都能按预期工作具有千兆字节内存和千兆赫速度 CPU 的现代计算机。在千字节和千赫兹的时代,您必须非常高效。在
fread()的情况下,与许多事情一样,如果您想了解更多信息,您必须询问。做从未使用过的额外工作真的很浪费,必须避免。 -
@tadman - 是的,从技术角度来看,现在很清楚了。我想在更一般的层面上,它只是可以接受的东西。感谢您的回答!