fread 中两个参数的意义?

Significance of two arguments in fread?

在阅读 fread here 的文档时,它解释说 void *ptr 之后的两个参数相乘以确定文件中读取/写入的字节数.下面是 link:

给出的 fread 的函数头
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

我的问题是,除了函数的返回值之外,调用每个函数之间是否真的存在行为或性能差异:

// assume arr is an int[SOME_LARGE_NUMBER] and fp is a FILE*
fread(arr, sizeof(arr), 1, fp);
fread(arr, sizeof(arr) / sizeof(int), sizeof(int), fp);
fread(arr, sizeof(int), sizeof(arr) / sizeof(int), fp);
fread(arr, 1, sizeof(arr), fp);

通常哪一个是最佳做法?或者更一般的问题是,我如何决定在任何给定场景中为每个参数指定什么?

编辑

澄清一下,我不是要求证明两个参数而不是一个参数的合理性,我要求的是一种通用方法来决定在任何给定场景中将什么传递给参数。 this answer Massimiliano link 在评论中编辑并引用的内容仅提供了两个具体示例,不足以解释为什么会发生这种行为。

如果没有足够的数据来满足请求,则行为会有所不同。从您链接到的页面:

The total number of elements successfully read are returned as a size_t object, which is an integral data type. If this number differs from the nmemb parameter, then either an error had occurred or the End Of File was reached.

因此,如果您指定只有一个元素大小为 sizeof(arr),并且没有足够的数据来填充 arr,那么您将不会返回任何数据。如果你这样做:

fread(arr, sizeof(int), sizeof(arr) / sizeof(int), fp);

然后arr如果没有足够的数据将被部分填充

您的代码的第三行最自然地符合 fread 的 API。但是,您可以使用其他形式之一 if 您记录 为什么 您没有做正常的事情。