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
字节at once吗?
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
字节at once吗?
性能上可能会有任何差异,也可能没有任何差异.在语义上是有区别的.
fread(a, 1, 1000, stdin);
try 读取1000个数据元素,每个数据元素为1字节长.
fread(a, 1000, 1, stdin);
try 读取1个1000字节长的数据元素.
它们是不同的,因为fread()
返回它能够读取的数据元素数,而不是字节数.如果它在读取完整的fread()
0字节之前到达文件末尾(或出现错误情况),则第一个版本必须准确指示它读取了多少字节;第二个失败并返回0.
实际上,它可能只会调用一个较低级别的函数,该函数try 读取fread()
0字节,并指示它实际读取了多少字节.对于较大的读取,它可能会进行多个较低级别的调用.fread()
要返回的值的计算方式不同,但计算费用微不足道.
如果实现可以在try 读取数据之前判断没有足够的数据可供读取,则可能会有所不同.例如,如果您正在读取一个900字节的文件,第一个版本将读取所有900个字节并返回900,而第二个版本可能不会读取任何内容.在这两种情况下,文件位置指示符都前进characters个成功读取的数字,即900.
但一般来说,你应该根据你需要的信息来 Select 如何调用它.如果部分读取并不比完全不读取任何内容好,则读取单个数据元素.如果部分读取是有用的,则以较小的块读取.