• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言fread和fwrite的用法详解(以数据块的形式读写文件)

C语言fread和fwrite的用法详解(以数据块的形式读写文件)

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。

对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件,具体原因我们已在《文本文件和二进制文件到底有什么区别》一文中进行了说明。

fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
fwrite() 函数用来向文件中写入块数据,它的原型为:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
对参数的说明:
  • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
  • size:表示每个数据块的字节数。
  • count:表示要读写的数据块的块数。
  • fp:表示文件指针。
  • 理论上,每次读写 size*count 个字节的数据。

size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。

返回值:返回成功读写的块数,也即 count。如果返回值小于 count:
  • 对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
  • 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。

【示例】从键盘输入一个数组,将数组写入文件再读取出来。
#include<stdio.h>#define N 5int main(){    //从键盘输入的数据放入a,从文件读取的数据放入b    int a[N], b[N];    int i, size = sizeof(int);    FILE *fp;    if( (fp=fopen("D:\\demo.txt", "rb+")) == NULL ){  //以二进制方式打开        puts("Fail to open file!");        exit(0);    }      //从键盘输入数据 并保存到数组a    for(i=0; i<N; i++){        scanf("%d", &a[i]);    }    //将数组a的内容写入到文件    fwrite(a, size, N, fp);    //将文件中的位置指针重新定位到文件开头    rewind(fp);    //从文件读取内容并保存到数组b    fread(b, size, N, fp);    //在屏幕上显示数组b的内容    for(i=0; i<N; i++){        printf("%d ", b[i]);    }    printf("\n");    fclose(fp);    return 0;}
运行结果:
23 409 500 100 222↙
23 409 500 100 222

打开 D:\\demo.txt,发现文件内容根本无法阅读。这是因为我们使用"rb+"方式打开文件,数组会原封不动地以二进制形式写入文件,一般无法阅读。

数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是rewind(fp);的作用。更多关于rewind函数的内容请点击:C语言rewind函数。
文件的后缀不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。
【示例】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。
#include<stdio.h>#define N 2struct stu{    char name[10]; //姓名    int num;  //学号    int age;  //年龄    float score;  //成绩}boya[N], boyb[N], *pa, *pb;int main(){    FILE *fp;    int i;    pa = boya;    pb = boyb;    if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){        puts("Fail to open file!");        exit(0);    }    //从键盘输入数据    printf("Input data:\n");    for(i=0; i<N; i++,pa++){        scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score);    }    //将数组 boya 的数据写入文件    fwrite(boya, sizeof(struct stu), N, fp);    //将文件指针重置到文件开头    rewind(fp);    //从文件读取数据并保存到数据 boyb    fread(boyb, sizeof(struct stu), N, fp);    //输出数组 boyb 中的数据    for(i=0; i<N; i++,pb++){        printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);    }    fclose(fp);    return 0;}
运行结果:
Input data:Tom 2 15 90.5↙Hua 1 14 99↙Tom  2  15  90.500000Hua  1  14  99.000000
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28深入解析C++中的函数模板和函数的默认参数
  • 2017-05-28简要对比C语言中的truncate()函数与ftruncate()函数
  • 2017-05-28c语言网络编程-标准步骤(改进版)
  • 2017-05-28使用C++进行Cocos2d-x游戏开发入门过程中的要点解析
  • 2017-05-28基于c语言中调试工具的用法汇总(不包含gdb)
  • 2017-05-28C语言科学计算入门之矩阵乘法的相关计算
  • 2017-05-28使用C语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法
  • 2017-05-28C语言压缩文件和用MD5算法校验文件完整性的实例教程
  • 2017-05-28详解C++编程中的变量相关知识
  • 2017-05-28VC读配置文件实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 深入探讨Linux静态库与动态库的详解(一看就懂)
    • C++ 类访问控制的条件总结
    • 使用c语言生成随机数的示例分享
    • 深入理解atoi()与itoa()函数的用法
    • C++指向函数的指针用法详解
    • 解析C++编程中的bad_cast异常
    • C++标准库中sstream与strstream的区别详细解析
    • c++遍历lua table示例
    • C++语言编写写日志类
    • C语言中的隐式函数声明

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有