我是 C 的初学者。我想知道检查返回值是否正确fread(3)
(即读取的项目数)小于检测 EOF 所请求的数量,而不仅仅是 0。例如,假设你有
#include <stdio.h>
int main(void)
{
unsigned char buffer[1024];
while (fread(buffer, 1, sizeof(buffer), stdin) == sizeof(buffer))
{
printf("%s\n", "Not EOF yet");
}
printf("%s\n", "At EOF");
return 0;
}
它是否正确?是否应检查== sizeof(buffer)
be != 0
反而?是fread
允许部分填充缓冲区吗?
我问的原因:看来read
可能返回小于sizeof(buffer)
。引用联机帮助页:
成功时,返回读取的字节数(零表示文件结尾),并且文件位置将前进该数字。如果这个数字小于
请求的字节数;例如,这可能会发生,因为现在实际上可用的字节较少(可能是因为我们接近文件结尾,或者因为我们正在从管道或从第三方读取)
minal),或者因为 read() 被信号中断。
然而,同样的逻辑似乎并不适用于fread
因为某些原因:
成功后,fread() 和 fwrite() 返回读取或写入的项目数。仅当 size 为 1 时,该数字才等于传输的字节数。如果发生错误,或者文件末尾
达到时,返回值是短项目计数(或零)。
所以我想确认支票确实应该是== sizeof(buffer)
并不是!= 0
.
感谢您的帮助!
您引用的手册部分说:
如果发生错误,或者到达文件末尾,则返回
value 是短项目计数(或零)。
这意味着你不能使用!=0
检查是否没有发生错误fread()
可以返回一个简短的项目计数。
的手册页fread() http://man7.org/linux/man-pages/man3/fread.3.html还指出:
fread() 不区分文件结尾和错误,并且
调用者必须使用 feof(3) 和ferror(3) 来确定发生了什么。
So if返回的项目数少于请求的数量,那么您必须使用feof()
or ferror()
找出发生了哪一个(如果是文件结尾,那么您可以得出结论,这不是输入错误,而是您正在读取的任何流上的输入结束)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)