当前课程知识点:C语言程序设计 > 第12章 文件 > 12.4 二进制文件读写 > 二进制文件读写
同学们大家好
前一节中我们讲了如何对文本文件进行读写操作
那二进制文件又用什么方式读写呢
也就是如何将内存中的二进制数据直接写入磁盘
又如何将磁盘上的二进制文件如何读入内存呢
C语言中的fread和fwrite函数用二进制方式对文件进行读写
fread函数从文件中读一个数据块
用fwrite函数向文件写一个数据块
在读写时是以二进制形式进行的
在向磁盘写数据时
直接将内存中一组数据原封不动
不加转换地复制到磁盘文件上
在读入时也是将磁盘文件中若干字节的内容一批读入内存
fread函数有4个参数
第一个参数buffer是一个地址
它是用来存放从文件读入的数据的存储区地址
第二个参数size是要读写的字节数
第三个参数count是要读写多少个数据项
每个数据项长度为size
第四个参数是文件类型指针
fread函数的返回值是实际读到的数据项的个数
如果结果与第三个参数count不同
则代表可能读到了文件的尾或者有错误发生
fwrite函数也有4参数
第一个参数buffer也是一个地址
是要把此地址开始的存储区中的数据向文件输出
剩余的参数和fread函数一样
下面这个例子是从磁盘文件中读二进制数据
存放在数组中
然后再把它们转存到磁盘文件上去
首先使用宏定义
定义10个学生
接着定义学生结构体
有姓名 学号 年龄和地址成员
定义全局结构体数组stud[SIZE]定义load函数
用于从磁盘文件读数据到数组中
定义文件指针fp
调用fopen函数使用rb
二进制读的方式打开文件
如果打开文件出错 则程序结束
接着调用fread函数循环读磁盘文件数据保存在结构体数组stud中
循环次数是结构体数组长度
也就是学生的个数10
每次从文件读入一个学生的信息保存在数组stud中
fread函数第一个参数&stud[i]是数组第i个学生的地址
第二个参数sizeof(struct Student tpye)结构体数组的长度
第三个参数1是每次读入一个数据
最后一个参数fp是文件指针
如果fread函数返回值和第三个参数1不同
代表文件到文件尾或出错
接下来用feof判断文件是否到文件尾
feof返回真则表示到文件尾 程序结束
否则是读取文件错误
输出提示信息
接下来定义函数save
向文件输出SIZE个学生的数据
调用fopen函数用wb
方式打开文件stu.dat
准备写入数据
如果返回值为空
则打开文件失败 程序结束
将数组stud中的每个元素写入文件
调用fwrite函数
第一个参数&stud[i]是需要写人的数组元素的地址
第二个参数sizeof(struct Student tpye)是需要写入的数据块的大小
第三个参数是写入的数据项的个数
这里是1 每次写入一个数组元素
最后一个参数是文件指针
当返回值与第三个参数1不同时
写入出错 程序退出
最后关闭文件指针
在main函数中
先调用load函数
将磁盘文件读入内存
再调用save函数
将内存中的二进制数据写入磁盘文件stu.dat文件中
在这个例子中我们使用fread和fwrite函数来对二进制文件进行读写操作
这一节的内容就讲到这里
谢谢大家!
-计算思维与计算机
--计算思维与计算机
--计算思维与计算机
--计算思维和计算机
-2.1 程序设计语言的发展及其特点和应用
--程序设计语言的特点及发展
- 2.2 C语言程序的基本结构及编制C语言程序的基本步骤
--C语言程序的结构和编制步骤
-3.1 C语言的数据类型
--C语言的数据类型
--C语言的数据类型
-3.2 常量
--常量
--常量
-3.3 什么是变量
--什么是变量
--什么是变量
-3.4 如何进行算术运算
--如何进行算术运算
--如何进行算术运算
-3.5 赋值运算符和逗号运算符
--赋值运算符和逗号运算符
-3.6 数据类型转换
--数据类型转换
--数据类型转换
-4.1 格式化输出printf
--格式化输出
-4.2 格式化输入scanf及字符数据的非格式化输入输出
--格式化输入
-5.1 关系运算符和关系表达式
--关系运算符和关系表达式
-5.2 逻辑运算符和逻辑表达式
--逻辑运算符和逻辑表达式
-5.3 条件运算符和条件表达式
--条件运算符和条件表达式
-5.4 if语句
--if语句
--if语句
-5.5 switch语句
--switch语句
--switch语句
-6.1 while语句
--while语句
--while语句
--do-while语句
-6.2 for语句
--for语句
--for语句
-6.3 循环的嵌套
--循环的嵌套
--循环的嵌套
-6.4 break语句和continue语句
--break和continue语句
-7.1 一维数组的定义和引用
--一维数组的定义和引用
-7.2 一维数组的赋值
--一维数组的赋值
--一维数组的赋值
-7.3 二维数组的定义和引用
--二维数组的定义和引用
-7.4 二维数组的赋值
--二维数组的赋值
--二维数组的赋值
-7.5 字符串的本质
--字符串的本质
--字符串的本质
-7.6 字符串操作的常用函数
--字符串常用函数
-7.7 字符串数组
--字符串数组
--字符串数组
-8.1 函数概述
--函数概述
--函数概述
-8.2 有参函数
--有参函数
--有参函数
-8.3 函数参数的传递方式
--函数参数的传递方式
-8.4 变量的作用域和生存期
--变量的作用域和生存期
-8.5 变量的存储类型
--变量的存储类型
--变量的存储类型
-8.6 函数的嵌套和递归调用
--函数的嵌套和递归调用
-8.7 函数的作用域与封装
--函数的作用域与封装
-9.1 指针变量的概念(上)
--指针变量的概念(上)
-9.2 指针变量的概念(下)
--指针变量的概念(下)
-9.3 指向一维数组的指针变量
--指向一维数组的指针变量
-9.4 指向二维数组的指针变量(上)
--指向二维数组的指针变量(上)
-9.5 指向二维数组的指针变量(下)
--指向二维数组的指针变量(下)
-9.6 动态内存分配
--动态内存分配
--动态内存分配
-10.1 编译预处理
--编译预处理
-11.1 用户自己建立数据类型
--用户自己建立数据类型
-11.2 定义结构体类型变量
--定义结构体类型变量
-11.3 结构体变量的引用与初始化
-11.4 结构体数组
--结构体数组
--结构体数组
-11.5 指向结构体类型数据的指针
--指向结构体类型数据的指针
-12.1 文件的基本概念和文件指针
--文件的基本概念和文件指针
-12,2 文件的打开和关闭
--文件的打开和关闭
--文件的打开和关闭
-12.3 文本文件读写
--文本文件读写
--文本文件读写
-12.4 二进制文件读写
--二进制文件读写
--二进制文件读写