我试图理解fread()函数是如何<stdio.h>工作的,我对这个函数的返回值感到困惑.在手册页中说
返回值
如果成功,fread()并fwrite()返回读取或写入的项目数.此数字等于仅在大小为1时传输的字节数.如果发生错误或达到文件末尾,则返回值为短项目计数(或零).
fread()不区分文件结束和错误,并且调用者必须使用feof(3)并ferror(3)确定发生了什么.
有人可以向我解释number of items read or written在这种情况下的含义.任何人都可以提供一些示例返回值及其含义吗?
moo*_*eep 12
fread()将从提供的IO流()中读取指定大小的项目数.它返回从流中成功读取的项目数.如果它返回的数字小于请求的项目数,则IO流可以被视为空(或以其他方式被破坏).FILE* stream
读取的字节数将等于成功读取的项目数乘以提供的项目大小.
考虑以下程序.
#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;
}
Run Code Online (Sandbox Code Playgroud)
当我们运行此程序时,根据提供的输入量,可以观察到不同的结果.
我们根本不提供任何输入.IO流将以空(EOF)开始为空.返回值为零.没有读过任何物品.零返回.
$ : | ./a.out
read 0 bytes
Run Code Online (Sandbox Code Playgroud)
我们根据要求提供更少的输入.在遇到EOF之前,将会读取一些项目.返回读取的项目数.没有更多项目可用.此后流是空的.
$ echo "Hello" | ./a.out
read 6 bytes
Run Code Online (Sandbox Code Playgroud)
我们根据要求提供相同或更多的输入.将返回请求的项目数.可能会有更多商品.
$ echo "Hello World" | ./a.out
read 8 bytes
Run Code Online (Sandbox Code Playgroud)
相关阅读:
当流中的字节数少于构成项时,从流中消耗的字节数可能大于按上述公式计算的读取的字节数.对上述相关问题的答案(及其评论)我发现在这件事上特别有见地:
的语法fread()是
size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );
Run Code Online (Sandbox Code Playgroud)
意思是,
该函数从 指向的流中
fread()读取nmemb每个size字节长的数据元素stream,并将它们存储在由 给定的位置ptr。
因此,读取的总字节数将为nmemb * size.
现在,通过说
成功时, fread() 和 fwrite() 返回读取或写入的项目数。此数字等于仅当 size 为 1 时传输的字节数。
这意味着,返回值将等于nmemb当size是1.
逻辑是一样的,在fwrite()也的情况下。
编辑
例如,一个完全成功的呼叫fread()喜欢
fread(readbuf, sizeof(int), 5 , stdin);
Run Code Online (Sandbox Code Playgroud)
将5在读取sizeof(int) * 5字节时返回。如果我们假设sizeof(int)是4,那么读取的总字节数将为5 * 4或20。正如你所看到的,在这里,项目的数量读取或写入是不相等的传输的字节数。
OTOH,另一个完全成功的呼吁fread()喜欢
fread(readbuf, sizeof(char), 5 , stdin);
Run Code Online (Sandbox Code Playgroud)
也将返回,5同时它将读取sizeof(char) * 5字节,即5字节。在这种情况下,作为sizeof(char)是1,因此,在这里,项目数读取或写入就是等于所述传输的字节数。即,5。
| 归档时间: |
|
| 查看次数: |
30425 次 |
| 最近记录: |