C语言中fread()函数的返回值是什么?

13
我正在尝试理解 <stdio.h> 中的 fread() 函数的工作原理,我对该函数的返回值感到困惑。在 man 手册中,它说:

返回值
成功时,fread()fwrite() 返回已读或已写入项的数量。 只有在 size 为 1 时,此数量等于传输的字节数。 如果发生错误或到达文件的结尾,则返回值是短项目计数(或零)。

fread() 不区分文件结束和错误,调用者必须使用 feof(3)ferror(3) 来确定哪一个发生了。

请问有人能够解释一下在这个语境中 number of items read or written 是什么意思吗?同时,是否有人可以提供一些示例返回值及其含义?
回答:本文讨论了 fread() 函数的返回值。成功时,fread() 返回已读取项的数量。如果 size 为 1,则此数量等于传输的字节数。如果发生错误或到达文件的结尾,则返回值是短项目计数(或零)。在这个语境中,“items” 指的是数据块的数量,每个数据块的大小由参数 size 指定。例如,如果我们使用 fread(buffer, sizeof(int), 10, fp) 从文件中读取 10 个 int 值,那么如果成功读取,则返回值将是 10,表示已经读取了 10 个 int 值。如果遇到了错误或在文件末尾处停止读取,则返回值可能小于 10。

3
fread()函数读取N * K个字节,其中N是每个元素的字节数,总共将读取K个元素。理想情况下,如果没有发生错误,则会返回K。如果发生错误或文件结束条件,则可能读取少于K个元素,在这种情况下,将返回小于K的数字。 - The Paramagnetic Croissant
相关链接:https://dev59.com/kmoy5IYBdhLWcg3wZdCr - Keith Thompson
2个回答

18

fread()函数会从提供的IO流(FILE* stream)中读取指定大小(size)count个项目(item),它返回成功从流中读取的项目数量。如果它返回的数量小于请求的项目数,则可以认为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)。返回值将为零。没有读取任何项。返回0。

$ : | ./a.out
read 0 bytes

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

$ echo "Hello" | ./a.out
read 6 bytes

我们会提供与要求相等或更多的输入。将返回所要求的项目数量。可能还有更多的项目可用。

$ echo "Hello World" | ./a.out
read 8 bytes

相关阅读:

当流中的字节数小于组成一个数据项所需的字节数时,从流中消耗的字节数可能比上述公式计算出来的字节数更多。我认为以下链接中的回答(及其评论)在这个问题上尤其有洞见:


如果您的程序使用fread()函数读取一个长度为7字节的文件,并将size参数设置为1、2和4,那么它对解决问题会更有帮助。 - ott--

7
< p > fread() 的语法是:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );

这意味着,fread() 函数从 stream 指向的流中读取nmemb 个长度为 size 字节的数据元素,并将它们存储在由 ptr 给出的位置。因此,读取的总字节数将是 nmemb * size
当说“成功时,fread() 和 fwrite() 返回读取或写入的项目数。当 size 为 1 时,该数字等于传输的字节数。”时,这意味着,当 size1 时,返回值将等于 nmemb
同样,在使用 fwrite() 时也是如此。

编辑

例如,对于 fread() 的完全成功调用:

 fread(readbuf, sizeof(int), 5 , stdin);

当调用 fread() 时,返回值为5,但它实际读取了sizeof(int) * 5个字节。如果我们假设sizeof(int)4,则总共读取的字节数将是5 * 420。在这里,可以看到读取或写入的项目数量传输的字节数量不相等。

另一方面,另一个成功的fread()调用如下:

fread(readbuf, sizeof(char), 5 , stdin);

当读取sizeof(char) * 5个字节时,也会返回5。在这种情况下,由于sizeof(char)等于1,因此读取或写入的项目数等于传输的字节数,即5


当size!= 1时会发生什么?我正在阅读将结构体的大小传递给此函数的代码。 - Jordan Camp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接