C中的fread()返回值

C中的fread()返回值,c,C,我试图理解中的fread()函数是如何工作的,我对该函数的返回值感到困惑。在手册页上写着 返回值 成功后,fread()和fwrite()返回读取的项目数 或者写。此数字仅等于传输的字节数 当大小为1时。如果发生错误,或文件的结尾是 到达时,返回值为短项计数(或零) fread()不区分文件结尾和错误,以及 呼叫者必须使用feof(3)和FEROR(3)来确定发生了什么 请有人向我解释一下在这种情况下所读或写的项目数是什么意思。还有谁能给我提供一些返回值及其含义的示例吗?fread()的语法是

我试图理解
中的
fread()
函数是如何工作的,我对该函数的返回值感到困惑。在手册页上写着

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

fread()
不区分文件结尾和错误,以及 呼叫者必须使用feof(3)和FEROR(3)来确定发生了什么

请有人向我解释一下在这种情况下所读或写的项目数是什么意思。还有谁能给我提供一些返回值及其含义的示例吗?

fread()的语法是

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );
也就是说

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

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

现在,通过说

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

这意味着,当
size
1时,返回值将等于
nmemb

fwrite()的情况下,逻辑也是相同的


编辑

例如,完全成功地调用
fread()
like

 fread(readbuf, sizeof(int), 5 , stdin);
fread(readbuf, sizeof(char), 5 , stdin);
将返回
5
,同时读取
sizeof(int)*5个字节。如果我们假设
sizeof(int)
4
,那么读取的总字节数将是
5*4
20
。如您所见,此处读取或写入的项目数不等于传输的字节数

OTOH,对
fread()的另一个完全成功的调用

 fread(readbuf, sizeof(int), 5 , stdin);
fread(readbuf, sizeof(char), 5 , stdin);
还将返回
5
,同时读取
sizeof(char)*5个
字节,即
5个
字节。在这种情况下,由于
sizeof(char)
1
,因此,这里读取或写入的项目数等于传输的字节数。i、 例如,
5

fread()
将从提供的IO流(
文件*流
)中读取指定大小的项目计数。它返回从流中成功读取的项目数。如果它返回的项目数小于请求的项目数,则可以认为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;
}
我们按要求提供较少的投入。在遇到EOF之前,将读取某些项目。返回读取的项目数。没有更多的项目可用。此后,流是空的

$ echo "Hello" | ./a.out
read 6 bytes
我们根据要求提供同等或更多的投入。将返回请求的项目数。可能会有更多的项目

$ echo "Hello World" | ./a.out
read 8 bytes
相关阅读:

当流中的字节数少于组成一个项目时,从流中消耗的字节数可能大于通过上述公式计算的读取字节数。对上述相关问题的回答(以及对该问题的评论),我发现在这件事上特别有见解:


fread()
读取
N*K
字节,其中
N
是每个元素中的字节数,总共将读取
K
个元素。理想情况下,如果没有发生错误,将返回
K
。如果出现错误或文件结束条件,则可能会读取小于
K
的元素,在这种情况下,将返回小于
K
的数字。相关:当大小为1尽管如此?我正在阅读将结构的大小传递给此函数的代码。如果您的程序对一个7字节长的文件执行fread(),并将大小设置为1、2和4,则会更有帮助(关于这个问题)。