fread函数中两个参数的意义是什么?

4

阅读 这里fread文档时,解释说在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在评论中提供的这个答案只提供了两个具体的例子,并没有充分解释为什么会发生这种行为。

行为是不同的,但由于您没有检查错误,因此无法看到它。性能取决于使用的特定库。在标记为重复的内容中,指出“fread 内部通过 fputc 进行工作”,这可能最初是正确的,但很难相信在21世纪仍然适用。 - Jongware
然后看一下链接中的第二个答案 ;) - Massimiliano
@Massimiliano 只指定了两种特殊情况,正如评论者所指出的,该答案需要大大改进。 - Patrick Roberts
在这种情况下,我会尝试改进现有的答案,而不是复制它。虽然只是我的一点建议。 - Massimiliano
1个回答

4
如果没有足够的数据满足请求,行为会有所不同。从您提供的页面中可以看到:
成功读取的元素总数以 size_t 对象的形式返回,这是一个整数数据类型。如果此数字与 nmemb 参数不同,则可能发生错误或已达到文件结尾。
因此,如果您指定只有一个大小为 sizeof(arr) 的元素,并且没有足够的数据填充 arr,则不会返回任何数据。如果您这样做:
fread(arr, sizeof(int), sizeof(arr) / sizeof(int), fp);

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

你的代码第三行最适合fread的API。然而,如果你记录下为什么不做正常的事情,你可以使用其他形式之一。


是的。正在修复它。谢谢! - Craig S. Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接