fread函数的返回值

使用fread返回值时需要注意,返回值不一定是读取到的字节数

函数原型

 //每次读取size个  读取nmemb次 
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//每次写入size个  读取nmemb次
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

返回值
RETURN VALUE
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1.

解析:当size=1的时候,返回值为读取/写入的字节数,如果size不为1则返回值不为字节数。
返回读写的次数,如果size=1,则返回值为读到的字节数。

比较返回值与fread时间

int get_string()
{
    FILE *fp;
    fp = fopen("flow.txt","r");
    if(fp == NULL)
    {
        printf("open flow error\n");
        return -1;
    }
    int ret=-1;
    char buf[512];

    struct timeval start, end;
    int interval;

    gettimeofday(&start, NULL);
    ret = fread(buf,1,26*5,fp);
    gettimeofday(&end, NULL);
    interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
    printf("ret1=%d\t",ret);

    printf("interval = %f\n\n", interval/1000.0);
    fseek(fp,0L,SEEK_SET);

    gettimeofday(&start, NULL);
    ret = fread(buf,26*5,1,fp);
    gettimeofday(&end, NULL);
    printf("ret2=%d\t",ret);
    interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);

    printf("interval = %f\n\n", interval/1000.0);
    fseek(fp,0L,SEEK_SET);
    gettimeofday(&start, NULL);
    ret = fread(buf,1024,1,fp);
    gettimeofday(&end, NULL);

	printf("ret3=%d\t",ret);
    interval = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
    printf("interval = %f\n\n", interval/1000.0);
    fclose(fp);
    return 0;
}

打印输出

ret1=130	interval = 0.005000

ret2=1	interval = 0.001000

ret3=0	interval = 0.001000

ret1 返回130,代表真实读到的字节数,因为每次只读一个字节,读取了130次,耗费时间比较大
ret2 返回1,读取1次,每次读26*5个字节,读到多少字节不知道,时间0.001000
ret3 返回0, 读取1次,每次读1024个字节 时间0.001000

ret2 ret3 读取不同的字节数量,但花费的时间一样。
ret2 ret3 返回值不同,ret3返回0,这与ret2返回的一次不同。

fwrite 的返回值也有同样的含义。

补充

 If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).

如果读写期间发生错误,或者到文件的结尾,返回的值是0,这在判断异常或者读到文件尾时非常有用。具体是哪种错误需要使用feof()或ferror()来决定。

循环读取文件,使用feof判断是否读到文件尾

int main()
{
    FILE *p = fopen("a.txt", "rb");
    char buffer[4] = {0};

    while(!feof(p)){
        memset(buffer, 0, sizeof(buffer));
        fread(buffer, sizeof(char), sizeof(buffer), p);
        printf("buffer = %s\n", buffer);
    }
    return 0;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为了维护世界和平_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值