恐惧中两个论点的意义?

时间:2015-04-25 06:27:53

标签: c fread

在阅读fread here的文档时,它解释了将void *ptr之后的两个参数相乘以确定在文件中读取/写入的字节数。以下是从链接中提供的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);

哪一个通常是最好的做法?或者更一般的问题是,如何确定在任何给定方案中为每个参数指定的内容?

修改

为了澄清,我并不是要求两个论证而不是一个论证的理由,我要求在决定在任何给定场景中传递给论证的内容时采用一般方法。 Massimiliano在评论中引用的this answer仅提供了两个具体的例子,并没有充分解释为什么会发生这种行为。

1 个答案:

答案 0 :(得分:3)

如果没有足够的数据来满足请求,则存在行为差异。从您链接到的页面:

  

成功读取的元素总数将作为size_t对象返回,该对象是一种完整的数据类型。如果此数字与nmemb参数不同,则表明发生了错误或达到了文件结束。

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

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

如果没有足够的数据,那么arr将被部分填充。

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