fread()返回C中的值

Jor*_*amp 9 c

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

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

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

有人可以向我解释number of items read or written在这种情况下的含义.任何人都可以提供一些示例返回值及其含义吗?

moo*_*eep 12

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

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

考虑以下程序.

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

我们根本不提供任何输入.IO流将以空(EOF)开始为空.返回值为零.没有读过任何物品.零返回.

$ : | ./a.out
read 0 bytes
Run Code Online (Sandbox Code Playgroud)

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

$ echo "Hello" | ./a.out
read 6 bytes
Run Code Online (Sandbox Code Playgroud)

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

$ echo "Hello World" | ./a.out
read 8 bytes
Run Code Online (Sandbox Code Playgroud)

相关阅读:

当流中的字节数少于构成项时,从流中消耗的字节数可能大于按上述公式计算的读取的字节数.对上述相关问题的答案(及其评论)我发现在这件事上特别有见地:


Sou*_*osh 6

的语法fread()

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );
Run Code Online (Sandbox Code Playgroud)

意思是,

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

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

现在,通过说

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

这意味着,返回值将等于nmembsize1.

逻辑是一样的,在fwrite()也的情况下。


编辑

例如,一个完全成功的呼叫fread()喜欢

 fread(readbuf, sizeof(int), 5 , stdin);
Run Code Online (Sandbox Code Playgroud)

5在读取sizeof(int) * 5字节时返回。如果我们假设sizeof(int)4,那么读取的总字节数将为5 * 420。正如你所看到的,在这里,项目的数量读取或写入不相等传输的字节数

OTOH,另一个完全成功的呼吁fread()喜欢

fread(readbuf, sizeof(char), 5 , stdin);
Run Code Online (Sandbox Code Playgroud)

也将返回,5同时它将读取sizeof(char) * 5字节,即5字节。在这种情况下,作为sizeof(char)1,因此,在这里,项目数读取或写入就是等于所述传输的字节数。即,5