fread()返回C中的值

时间:2015-02-08 19:20:44

标签: c

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

  

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

     

fread()无法区分文件结束和错误,以及          来电者必须使用feof(3)ferror(3)来确定发生的事件。

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

3 个答案:

答案 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时传输的字节数。

这意味着,当nmembsize

时,返回值将等于1.

逻辑相同,如果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

答案 2 :(得分:0)

读取或写入的项目数是指从FILE流读取到缓冲区的size_t大小的对象数。当您打算从FILE读取N个字节到缓冲区时,它应该返回N并且您可以将其存储在变量中以查看它是否真正读取了所有字节。如果是返回值!= N,则表示发生了错误。例如,如果你有一个包含4个32位整数的文件,你可以用elements_read = fread(buf,sizeof(int),4,fp)读取它;如果没有错误发生,则bytes_read应为4