【问题标题】:fread() return value in Cc语言中的fread()返回值
【发布时间】:2018-01-04 21:02:32
【问题描述】:

我试图了解<stdio.h> 中的fread() 函数是如何工作的,但我对这个函数的返回值感到困惑。在手册页中它说

返回值
成功时,fread()fwrite() 返回读取的项目数 或书面。此数字等于仅传输的字节数 当 size 为 1 时。如果发生错误,或者文件的结尾是 达到,返回值是一个短的项目计数(或零)。

fread() 不区分文件结尾和错误,并且 调用者必须使用feof(3)ferror(3) 来确定发生了什么。

有人可以向我解释一下number of items read or written 在这种情况下的含义吗?还有谁能给我一些示例返回值及其含义?

【问题讨论】:

  • fread() 读取N * K 字节,其中N 是每个元素中的字节数,总共将读取K 元素。理想情况下,如果没有错误发生,K 将被返回。如果发生错误或文件结束条件,则可能会读取小于 K 的元素,在这种情况下,将返回小于 K 的数字。

标签: c


【解决方案1】:

fread() 将从提供的 IO 流 (FILE* stream) 中读取 count 个指定 size 的项目。它返回从流中成功读取的项数。如果它返回的数字小于请求的项目数,则可以认为 IO 流为空(或以其他方式损坏)。

读取的字节数将等于成功读取的项目数乘以提供的项目大小

考虑以下程序。

#include <stdio.h>

int main() {
    char buf[8];
    size_t ret = fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), stdin);
    printf("read %zu bytes\n", ret*sizeof(*buf));
    return 0;
}

当我们运行这个程序时,根据提供的输入量,可以观察到不同的结果。

我们根本无法提供任何输入。 IO 流以 (EOF) 开头为空。返回值将为零。未阅读任何项目。返回零。

$ : | ./a.out
read 0 bytes

我们根据要求提供较少的输入。在遇到 EOF 之前会读取一些项目。返回读取的项目数。没有更多可用的项目。此后流为空。

$ echo "Hello" | ./a.out
read 6 bytes

我们根据要求提供相同或更多的输入。将返回请求的项目数。可能会提供更多项目。

$ echo "Hello World" | ./a.out
read 8 bytes

相关阅读:

当流中的字节数少于构成项目的字节数时,流中消耗的字节数可能会大于计算出的读取字节数由上式。这个对上述链接问题的回答(以及对它的评论)我发现在这个问题上特别有见地:

【讨论】:

  • 如果你的程序对一个 7 字节长的文件执行 fread() 并且大小设置为 1、2 和 4,它会更有帮助(关于这个问题)。
【解决方案2】:

fread() 的语法是

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );

也就是说,

函数fread()stream指向的流中读取nmemb数据元素,每个size字节长,,将它们存储在ptr给定的位置.

因此,读取的总字节数将为nmemb * size

现在说

成功时,fread() 和 fwrite() 返回读取或写入的项目数。此数字等于仅当 size 为 1 时传输的字节数。

这意味着,当size1.时,返回值将等于nmemb

逻辑相同,fwrite() 也一样。


编辑

例如,对fread() 的完全成功调用

 fread(readbuf, sizeof(int), 5 , stdin);

将返回5,同时读取sizeof(int) * 5 字节。如果我们假设sizeof(int)4,那么读取的总字节数将为5 * 420。如您所见,这里读取或写入的项目数不等于传输的字节数

OTOH,又一次完全成功地致电fread() 喜欢

fread(readbuf, sizeof(char), 5 , stdin);

还将返回5,同时它会读取sizeof(char) * 5 字节,即5 字节。在这种情况下,sizeof(char)1,所以,这里 读取或写入的项目数 等于 传输的字节数。即5

【讨论】:

  • 当 size != 1 时会发生什么?我正在阅读将结构的大小传递给此函数的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2012-07-27
  • 2021-07-07
相关资源
最近更新 更多