关于fread()函数返回值的几个易错点

函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

头文件:stdio.h

功能:以数据块的方式从文件中读取相应的内容。

参数:
    ptr:存放读取出来的数据。
    size:指定读取文件内容的块数据大小,类型size_t为unsigned int类型。
    nmemb:指定读取文件的块数。
    stream:已经打开的文件指针。
    这里读取的文件数据总大小为 size*nmemb。

返回值:失败返回0,成功则返回实际读取到的文件内容的块数。

 

源码如下:

#include <stdio.h>
  
typedef struct _Student {
        int age;
        char buf[50];
        int score;
} Student;

int file_write(void)
{
        FILE *fp = NULL;
        fp = fopen("Fwrite_Fread.txt", "w");
        if(fp == NULL)
        {
                perror("file_write fopen");
                return -1;
        }
        Student std[3] = {
                {20, "alo", 80},
                {24, "blo", 85},
                {27, "clo", 90}
        };
        fwrite(std, sizeof(Student), 3, fp);
        fclose(fp);
        fp = NULL;
        return 0;
}

int file_read(void)
{
        FILE *fp = NULL;
        fp = fopen("Fwrite_Fread.txt", "r");
        if(fp == NULL)
        {
                perror("file_read fopen");
                return -1;
        }
        Student std[10];
        int len = 0;
        len = fread(std, sizeof(Student), 2, fp);
        printf("fread_return = %d\n", len);
        for(int i = 0; i < 3; i++)
        {
                printf("%d  %s  %d\n", std[i].age, std[i].buf, std[i].score);
        }
        fclose(fp);
        fp = NULL;
}

int main(int argc, char *argv[])
{
        file_write();
        file_read();
        return 0;
}

 

① 当指定大小为 fread(std, sizeof(Student), 2, fp);

这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为2*sizeof(Student)是小于文件内的总大小3*sizeof(Student)的,所以fread()返回值为指定的块数目,即 fread_return = 2。
因为指定的是2*sizeof(Student)大小,所以只读取到前两个结构体的数据,第三个没有读取到,结果如下:

20  alo  80
24  blo  85
0    1962291840

 

② 当指定大小为 fread(std, sizeof(Student), 10, fp);

这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为10*sizeof(Student)是大于文件内的总大小3*sizeof(Student)的,所以fread()返回值为实际读取的块数目,即 fread_return = 3。
因为指定的是10*sizeof(Student)大小,所以可以读取到三个结构体的数据,结果如下:

20  alo  80
24  blo  85
27  clo  90

 

③ 当指定大小为 fread(std, sizeof(std), 10, fp);

这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为10*sizeof(std)是大于文件内的总大小3*sizeof(Student)的,但是一个数据块的大小为sizeof(std)=10*60=600Byte的,文件里面的大小为3*sizeof(Student)=180Byte的,所以读取到的内容是没有装满一个数据块的,fread()返回值为0,即 fread_return = 0。
但是内容是有读取到并被保存的,结果如下:

20  alo  80
24  blo  85
27  clo  90

 

④ 当指定大小为 fread(std, 1, sizeof(std), fp);

这里如果把块大小指定为1的话,那么返回值即读取文件的总大小sizeof(std)即180Byte,结果如下:

20  alo  80
24  blo  85
27  clo  90

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值