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字节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 如何调用它.如果部分读取并不比完全不读取任何内容好,则读取单个数据元素.如果部分读取是有用的,则以较小的块读取.

C++相关问答推荐

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

ARM上的Modulo Sim Aarch 64(NEON)

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

为什么在C中设置文件的位置并写入文件,填充空字符?

如何使用Python C API实现多线程程序?

ZED for SDL上的C语言服务器

堆栈在作用域阻塞后会被释放吗?

在编译时参数化类型定义

C中函数类型的前向声明

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

链接到底是如何工作的,我在这里到底做错了什么

我在C程序的Flex/Bison中遇到语法错误

struct 中的qsort,但排序后的 struct 很乱

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

在 C 中传递参数时出现整数溢出

Clang 是否为内联汇编生成了错误的代码?

如何在C中以0x格式打印十六进制值

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?

设置具有非零终止字符串的大整数