阅读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);
通常哪一个是最佳实践?或者更一般的问题是,我如何决定在任何给定场景中为每个参数指定什么?
编辑
澄清一下,我不是要求证明两个参数而不是一个参数的合理性,我要求的是一种通用方法来决定在任何给定场景中将什么传递给参数。和 this answer Massimiliano 在评论中链接并引用的内容仅提供了两个具体示例,并不能充分解释为什么会发生这种行为。
最佳答案
如果没有足够的数据来满足请求,则行为会有所不同。从您链接到的页面:
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。但是,如果您记录为什么您没有做正常的事情,您可以使用其他形式之一。
关于c - fread 中两个参数的意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29861811/