猿问

fread如何真正起作用?

的声明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字节吗?


慕码人2483693
浏览 496回答 3
3回答

MYYA

性能可能有差异,也可能没有差异。语义上有所不同。fread(a, 1, 1000, stdin);尝试读取1000个数据元素,每个元素长1个字节。fread(a, 1000, 1, stdin);尝试读取1个1000字节长的数据元素。它们不同,因为fread()返回的是它能够读取的数据元素的数量,而不是字节的数量。如果在读取完整的1000个字节之前到达文件末尾(或错误状态),则第一个版本必须确切指出读取的字节数;第二个只是失败并返回0。实际上,它可能只是调用一个较低级别的函数,该函数尝试读取1000个字节并指示实际读取了多少个字节。对于较大的读取,它可能会发出多个较低级别的调用。要返回的值的计算fread()方法不同,但是计算费用微不足道。如果实现能够在尝试读取数据之前告诉您没有足够的数据可读取,则可能会有所不同。例如,如果您正在读取900字节的文件,则第一个版本将读取所有900字节并返回900,而第二个版本可能不会费心地读取任何内容。在这两种情况下,文件位置指示符都会成功读取成功的字符数,即900。但是通常,您可能应该根据需要的信息来选择如何调用它。如果部分读取并不比完全不读取任何数据更好,则读取一个数据元素。如果部分读取很有用,则以较小的块读取。

交互式爱情

根据规范,两者的实现方式可能会有所不同。如果您的文件少于1000个字节,fread(a, 1, 1000, stdin)(读取1000个元素,每个元素1个字节)仍将复制所有字节,直到EOF。另一方面,未指定fread(a, 1000, 1, stdin)存储(读取1个1000字节元素)的结果a,因为没有足够的数据来完成对“第一个”(也是唯一的)1000字节元素的读取。当然,某些实现可能仍会根据需要将“ partial”元素复制到任意多个字节中。
随时随地看视频慕课网APP
我要回答