我试图了解fread()
中的<stdio.h>
函数是如何工作的,我对这个函数的返回值感到困惑。在手册页中说明了
返回值
成功时,fread()
和fwrite()
会返回读取的项目数 或写的。此数字等于仅传输的字节数 当大小为1.如果发生错误,或文件结束 到达时,返回值是短项目计数(或零)。
fread()
无法区分文件结束和错误,以及 来电者必须使用feof(3)
和ferror(3)
来确定发生的事件。
有人可以向我解释number of items read or written
在这种情况下的含义。也有人能为我提供一些示例返回值及其含义吗?
答案 0 :(得分:11)
fread()
将从提供的IO流(FILE* stream
)中读取指定 size 项目的 count 。它从流中返回成功读取的项目数。如果它返回的数字小于请求的项目数,则IO流可以被视为空(或以其他方式中断)。
读取的字节数将等于成功读取的项目数乘以项目提供的 size 。
考虑以下计划。
#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
相关阅读:
当流中的字节数少于构成项时,流中消耗的字节数可能大于计算的 read 字节数按上述公式计算。对上述相关问题(及其评论)的回答我在这件事上特别有见地:
答案 1 :(得分:4)
fread()
的语法是
size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );
这意味着,
函数
fread()
从nmemb
指向的流中读取size
个数据元素,每个stream
字节长,并存储它们在ptr
给出的位置。
因此,读取的总字节数为nmemb * size
。
现在,说
成功时,fread()和fwrite()返回读取或写入的项目数。此数字等于仅在大小为1时传输的字节数。
这意味着,当nmemb
为size
1.
逻辑相同,如果fwrite()
也是如此。
修改
例如,对fread()
的完全成功调用,如
fread(readbuf, sizeof(int), 5 , stdin);
将返回5
,而它将读取sizeof(int) * 5
个字节。如果我们假设sizeof(int)
为4
,则读取的总字节数为5 * 4
或20
。如您所见,此处读取或写入的项目数 不等于 传输的字节数。
OTOH,另一个完全成功的fread()
呼叫
fread(readbuf, sizeof(char), 5 , stdin);
也将返回5
,同时它将读取sizeof(char) * 5
个字节,即5
个字节。在这种情况下,由于sizeof(char)
为1
,因此,此处读取或写入的项目数与数字相等传输的字节数。即,5
。
答案 2 :(得分:0)
读取或写入的项目数是指从FILE流读取到缓冲区的size_t大小的对象数。当您打算从FILE读取N个字节到缓冲区时,它应该返回N并且您可以将其存储在变量中以查看它是否真正读取了所有字节。如果是返回值!= N,则表示发生了错误。例如,如果你有一个包含4个32位整数的文件,你可以用elements_read = fread(buf,sizeof(int),4,fp)读取它;如果没有错误发生,则bytes_read应为4