2015-02-08 69 views
7

我想了解<stdio.h>中的fread()函数是如何工作的,我对此函数的返回值感到困惑。在手册页它说fread()返回值C

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

fread()不和错误文件结束之间区分,并且 呼叫者必须使用feof(3)ferror(3)以确定发生。

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

+2

'FREAD()''读取N * K'字节,其中'N'是每个元素中的字节数,总共将读取“K”个元素。理想情况下,如果没有错误发生,将返回“K”。如果出现错误或文件结束条件,则可能会读取少于'K'个元素,在这种情况下,将返回小于'K'的数字。 – 2015-02-08 19:24:52

+0

相关:http://stackoverflow.com/q/8589425/827263 – 2015-02-08 20:30:00

回答

11

fread()将读取从所提供的IO流(FILE* stream)指定大小的项的计数。它从流中返回成功读取的项目数。如果它返回一个小于所请求的项目数量的数字,则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; 
} 

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

我们根本不能提供任何输入。 IO流将以空(EOF)开始。返回值将为零。没有项目被读取。零返回。

$ : | ./a.out 
read 0 bytes 

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

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

我们根据您的要求提供相同或更多的输入。所请求的项目数量将被退回。更多的项目可能会提供。

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

相关阅读:

当存在流中更少的字节比之和构成的项目,字节的数目消耗从流然而可能是更大的根据上述公式计算的字节数的读数为。这个答案上面链接的问题(和它的评论),我觉得在这个问题上特别有见地:

+0

如果一个文件的fread()长度为7个字节,大小设置为1,2和4,那么你的程序会更有帮助(关于这个问题)。 – 2015-02-08 19:59:49

3

fread()的语法是

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

这意味着,

功能fread()读取数据的nmemb元素,每个size字节长,从流通过stream指出,存储他们在ptr给出的位置。

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

现在,说

成功

,FREAD()和fwrite()返回的项目数读取或写入。这个数目等于仅传输的字节数时大小为1

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

Logic是一样的,在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

+0

大小!= 1时发生了什么?我正在阅读通过结构的大小的代码到这个函数。 – 2015-02-08 19:33:54

+0

@JordanCamp我已更新。希望现在清楚。 :-) – 2015-02-08 19:56:47

0

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

+0

这并不意味着字节数,除非给定的块大小是1个字节。 – hyde 2015-02-08 19:31:01

+0

好吧,它确实是size_t大小的元素,我的坏 – BsD 2015-02-08 19:39:38

+1

请修复或删除这个答案 - 所以我们不必倒推它,然后将其标记为删除。 – 2015-02-08 19:49:14