gpt4 book ai didi

c - fread 是如何运作的?

转载 作者:太空狗 更新时间:2023-10-29 16:16:03 24 4
gpt4 key购买 nike

fread声明如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

问题是:对 fread 的两次这样的调用在读取性能上是否存在差异:

char a[1000];
  1. fread(a, 1, 1000, stdin);
  2. fread(a, 1000, 1, stdin);

它会每次一次读取1000字节吗?

最佳答案

性能可能有也可能没有。语义上存在差异。

fread(a, 1, 1000, stdin);

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

fread(a, 1000, 1, stdin);

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

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

在实践中,它可能只是调用一个较低级别的函数来尝试读取 1000 个字节并指示它实际读取了多少字节。对于较大的读取,它可能会进行多个较低级别的调用。 fread() 返回值的计算方式不同,但计算开销很小。

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

但一般来说,您应该根据需要从中获取哪些信息来选择如何调用它。如果部分读取并不比根本不读取任何内容更好,则读取单个数据元素。如果部分读取有用,则读取较小的 block 。

关于c - fread 是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8589425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com