3 回答
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。
但是通常,您可能应该根据需要的信息来选择如何调用它。如果部分读取并不比完全不读取任何数据更好,则读取一个数据元素。如果部分读取很有用,则以较小的块读取。
TA贡献1712条经验 获得超3个赞
根据规范,两者的实现方式可能会有所不同。
如果您的文件少于1000个字节,fread(a, 1, 1000, stdin)(读取1000个元素,每个元素1个字节)仍将复制所有字节,直到EOF。另一方面,未指定fread(a, 1000, 1, stdin)存储(读取1个1000字节元素)的结果a,因为没有足够的数据来完成对“第一个”(也是唯一的)1000字节元素的读取。
当然,某些实现可能仍会根据需要将“ partial”元素复制到任意多个字节中。
- 3 回答
- 0 关注
- 495 浏览
添加回答
举报