c - read() 和 fread() return 值
c - read() and fread() return values
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()
不区分是否有任何实际原因?
提前致谢!
fread
的 return 值为 size_t
。这是一个无符号类型,因此没有可用值不同于指示读取了多少项的值。
此外,fread()
可能需要多次调用 read()
才能读取所有请求的项目。如果在后面的一次读取中发生错误或 EOF,它应该仍然 return 之前成功读取的所有项目。所以它 return 那个项目计数。
由于无法在 return 值中编码短项目计数的原因,因此需要有一些其他方式来 returning 这个。使用 feof()
和 ferror()
.
将其留给调用者更容易
如果read()
在部分读取后遇到错误,这通常被视为成功。它 returns 读取的数据的长度。直到 下一次 调用 read()
时,调用方才发现错误,当时它 returns -1
并设置 errno
.
一个信号也会导致 read()
提前到 return。在这种情况下,它 returns -1
并设置 errno == EINTR
。内核将部分读取保存在缓冲区中,以便可以在下一次调用时 returned。
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()
不区分是否有任何实际原因?
提前致谢!
fread
的 return 值为 size_t
。这是一个无符号类型,因此没有可用值不同于指示读取了多少项的值。
此外,fread()
可能需要多次调用 read()
才能读取所有请求的项目。如果在后面的一次读取中发生错误或 EOF,它应该仍然 return 之前成功读取的所有项目。所以它 return 那个项目计数。
由于无法在 return 值中编码短项目计数的原因,因此需要有一些其他方式来 returning 这个。使用 feof()
和 ferror()
.
如果read()
在部分读取后遇到错误,这通常被视为成功。它 returns 读取的数据的长度。直到 下一次 调用 read()
时,调用方才发现错误,当时它 returns -1
并设置 errno
.
一个信号也会导致 read()
提前到 return。在这种情况下,它 returns -1
并设置 errno == EINTR
。内核将部分读取保存在缓冲区中,以便可以在下一次调用时 returned。