在阅读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仅提供了两个具体的例子,并没有充分解释为什么会发生这种行为。
答案 0 :(得分:3)
如果没有足够的数据来满足请求,则存在行为差异。从您链接到的页面:
成功读取的元素总数将作为size_t对象返回,该对象是一种完整的数据类型。如果此数字与nmemb参数不同,则表明发生了错误或达到了文件结束。
因此,如果您指定只有一个大小为sizeof(arr)
的元素,并且没有足够的数据来填充arr
,那么您将不会返回任何数据。如果你这样做:
fread(arr, sizeof(int), sizeof(arr) / sizeof(int), fp);
如果没有足够的数据,那么arr
将被部分填充。
代码的第三行最自然地符合fread
的API。但是,您可以使用其他表单之一如果您记录为什么您没有做正常的事情。