fread函数详解

举报
芒果_Mango 发表于 2022/03/28 10:31:32 2022/03/28
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

fread - 以二进制形式读取

image-20220310224237209

  • 第一个参数:用来存储读取到的数据的地址
  • 第二个参数:要被读取的每一个数据的大小(字节数)
  • 第三个参数:要读取的个数
  • 第四个参数:文件指针
  • 只不过读取是从文件流->buffer,而写入是由buffer->文件流
  • 从流里读count个大小为size的数据
  • 以二进制形式读取:rb
文件使用方式 含义 如果指定文件不存在
“rb” (只读) 为了输入数据,打卡一个二进制文件 出错

注意:小细节

fwrite写入时,第一个参数为: const void* buffer

fread读取时:第一个参数为:void* buffer

写入的时候加const,读取的时候不加const原因:

写入时,是把buffer的内容写入到文件中,不对buffer数据修改,所以可以加const修饰。

读取时:是把文件中的数据写入到buffer,buffer的内容要被修改

fread的返回值

count:指定一次读几个

如果返回值小于count,说明已经读完了,因为这一次都没有读满,下次没有数据了。如果返回值小于count,说明是最后一次读取了 所以可以根据它的返回值判断是否读取结束

image-20220310224528472

翻译:fread返回实际读取的完整项目数,如果发生错误或在达到计数之前遇到文件结尾,则该值可能小于计数。使用feof或ferror函数区分读取错误和文件结束情况。如果大小或计数为0,则fread返回0且缓冲区内容不变。
 	如果返回的值小于count,说明已经读取完了

从上述fwrite写入的内容中读取数据

struct S
{
   int n ;
    double d;
    char name[10];
};
int main()
{
    struct S s = {0};
    //以二进制形式打开文件
    FILE* pf = fopen("data.txt","rb");
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    //写文件-二进制形式写
    fread(&s,sizeof(s),1,pf);
    
    //打印读取的结果
    printf("%d %lf %s\n",s.n,s.d,s.name);
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

执行结果

image-20220310224538741


文件读写注意事项:

  • 最开始要先打开文件,然后进行判断是否打开成功!
  • 读写结束后,要关闭文件
  • 每进行一次读写,文件指针的位置都会发生偏移
    • 如:读取一个字符之后,文件指针指向下一个字符,写入一个字符后,文件指针指向下一个位置
    • 写入/读取一行字符同理

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。