【问题标题】:Significance of two arguments in fread?fread 中两个参数的意义?
【发布时间】:2015-07-03 21:40:44
【问题描述】:

在阅读freadhere 的文档时,它解释了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);

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

编辑

为了澄清,我不是要求证明两个论点而不是一个论点,我要求的是一种通用方法来决定在任何给定情况下传递给论点的内容。而马西米利亚诺在 cmets 中链接并引用的 this answer 仅提供了两个具体示例,并没有充分解释为什么会发生这种行为。

【问题讨论】:

  • 行为是不同的,但是由于您不检查错误,因此您看不到它。 性能 依赖于使用的特定库。在标记为重复项中指出“fread 在内部通过fputc 工作”,这最初可能是正确的,但在 21 世纪很难相信。
  • 然后看看链接中的第二个答案;)
  • @Massimiliano 仅指定了两种特殊情况,正如评论者指出的那样,该答案可能需要很多改进。
  • 在这种情况下,我会尝试改进现有答案,而不是复制它。不过,只是我的 2 美分。

标签: c fread


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的。修复它。谢谢!
猜你喜欢
  • 2013-01-04
  • 2016-12-29
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2012-12-30
  • 2011-11-08
  • 2021-06-15
  • 2014-08-28
相关资源
最近更新 更多