c - fread 中两个参数的意义?

标签 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);

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

编辑

澄清一下,我不是要求证明两个参数而不是一个参数的合理性,我要求的是一种通用方法来决定在任何给定场景中将什么传递给参数。和 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/

相关文章:

c - 读写结构 [C]

c - 使用 popen() 打开的文件描述符上的 pclose() 返回 errno 10(无子进程)

c - uint_8、uint_16 和 uint_32 的用法

c - C内存读写BMP文件错误

c - 如何在 GCC C 中获取对齐的打包结构数组?

c - 这是 FPS 独立游戏循环的良好实现吗?

c - 动态二维数组好像要分配更多的内存

c - 打包要从 C 调用的 Lua 脚本文件的最佳做法是什么。使用 CMake

c - 我的代码有什么问题吗?错误预期标识符或 '('

c - 在有限制的情况下玩一会儿 - C 编程