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,则会更有帮助(关于这个问题)。