为了账号安全,请及时绑定邮箱和手机立即绑定

fread如何真正起作用?

fread如何真正起作用?

C
慕码人2483693 2019-10-17 10:54:29
的声明fread如下:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);问题是:两次这样的调用的阅读性能是否有所不同fread:char a[1000];fread(a, 1, 1000, stdin);fread(a, 1000, 1, stdin);会一次读取一次1000字节吗?
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

性能可能有差异,也可能没有差异。语义上有所不同。


fread(a, 1, 1000, stdin);

尝试读取1000个数据元素,每个元素长1个字节。


fread(a, 1000, 1, stdin);

尝试读取1个1000字节长的数据元素。


它们不同,因为fread()返回的是它能够读取的数据元素的数量,而不是字节的数量。如果在读取完整的1000个字节之前到达文件末尾(或错误状态),则第一个版本必须确切指出读取的字节数;第二个只是失败并返回0。


实际上,它可能只是调用一个较低级别的函数,该函数尝试读取1000个字节并指示实际读取了多少个字节。对于较大的读取,它可能会发出多个较低级别的调用。要返回的值的计算fread()方法不同,但是计算费用微不足道。


如果实现能够在尝试读取数据之前告诉您没有足够的数据可读取,则可能会有所不同。例如,如果您正在读取900字节的文件,则第一个版本将读取所有900字节并返回900,而第二个版本可能不会费心地读取任何内容。在这两种情况下,文件位置指示符都会成功读取成功的字符数,即900。


但是通常,您可能应该根据需要的信息来选择如何调用它。如果部分读取并不比完全不读取任何数据更好,则读取一个数据元素。如果部分读取很有用,则以较小的块读取。


查看完整回答
反对 回复 2019-10-17
?
交互式爱情

TA贡献1712条经验 获得超3个赞

根据规范,两者的实现方式可能会有所不同。


如果您的文件少于1000个字节,fread(a, 1, 1000, stdin)(读取1000个元素,每个元素1个字节)仍将复制所有字节,直到EOF。另一方面,未指定fread(a, 1000, 1, stdin)存储(读取1个1000字节元素)的结果a,因为没有足够的数据来完成对“第一个”(也是唯一的)1000字节元素的读取。


当然,某些实现可能仍会根据需要将“ partial”元素复制到任意多个字节中。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 495 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信