




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第十章文件 10 1文件 10 2缓冲文件系统基础 2 10 1文件 10 1 1文件的概念 磁盘文件在DOS管理中被定义为存贮在外部介质上的程序或数据的集合 是一批逻辑上有联系的数据每个文件都有一个文件名作为标识 每个文件在磁盘中的具体存放位置 格式都由操作系统中的文件系统管理 也就是说 操作系统是以文件为单位对程序或数据进行管理的 编辑后存于磁盘上的源程序文件 C 经编译后得到的目标文件 OBJ 连接之后形成的可执行文件 EXE等 3 在C语言中文件的含义更为广泛 不仅包含以上所述的磁盘文件 还包括一切能进行输入 输出的终端设备 它们被看成是设备文件 如键盘常称为标准输入文件 显示器称为标准输出文件 文件是由磁盘文件和设备文件组成的 作为磁盘文件之一的数据文件是本章学习的主要对象 数据文件可以看作是C中最后一种数据类型 是C语言重要的组成部分 根据文件内数据的组织形式 文件可分为文本 text 文件和二进制文件 文本文件又称为ASCII码文件 它的每一个字节存放一个字符的ASCII码 4 10 1 2数据流 数据流是对数据输入输出行为的一种抽象 各种各样的终端设备或磁盘文件的细节是非常复杂多样的直接对它们编程将会非常繁琐 引入数据流的概念有效地解决了这一难题 只要建立了输入输出数据流 编程者在应用程序中就不需要关心底层输入输出设备或是任何磁盘文件的具体细节差异 程序中要输入数据 只需从输入数据流中读入 输出数据只需向输出数据流中写出即可 这样就使程序完全与具体硬件资源脱离了关系 也就是说数据流使C程序与具体系统完全不相关 使C程序可以非常方便地移植 5 10 1 3C的文件系统及其与流的关系 C的文件系统可分为缓冲文件系统和非缓冲文件系统两类 所谓缓冲文件系统 又称高级磁盘输入输出系统 在调用这种文件处理函数时 会自动在用户内存区中为每一个正在使用的文件划出一片存贮单元 称为开辟一个缓冲区 设立缓冲区的原因是磁盘的读写速度比内存的处理速度要慢很多 而且磁盘驱动器是机电设备 定位精度比较差 所以磁盘数据存取要以扇区 磁盘上某磁道中的一个弧形段 通常存放固定数量的数据 或者簇 由若干扇区组成 为单位 6 10 2缓冲文件系统基础 一般缓冲文件操作有三个必需的步骤 1 在使用文件前要调用打开函数将文件打开 若打开失败 则返回一个空指针 若打开正常 可以得到一个文件指针 并利用它继续对文件操作 2 可调用各种有关函数 利用该指针对文件进行具体处理 一般要对文件进行读或写操作 3 在文件用完时 应及时调用关闭函数来关闭文件 切断数据流 防止数据遗失或误操作破坏文件内容 7 10 2 1文件指针 文件类型FILE不是C语言的新类型 它是用typedef定义出来的有关文件信息的一种结构体类型 如TurboC2 0版的stdio h文件中有如下的定义 typedefstruct shortlevel 缓冲区 满 或 空 的程度 unsignedflags 文件状态标志 charfd 文件描述符 unsignedcharhold 如无缓冲区不读取字符 8 shortbsize 缓冲区的大小 unsignedchar buffer 数据缓冲区的位置 unsignedchar curp 当前工作指针 unsignedistemp 临时文件 指示器 shorttoken 用于有效性检查 FILE 9 10 2 2打开文件 fopen函数 打开函数fopen 的调用方式是 FILE fp fp fopen 文件名 使用文件方式 例如 fp fopen A1 DAT r 10 表12 1文件使用方式 11 10 2 3关闭文件 fclose函数 在使用完一个文件后应该调用fclose函数关闭文件 fclose函数的调用格式为fclose 文件指针 例如fclose fp 就把指针fp所指的文件关闭了 也就是断开了打开文件时建立的数据流 fp与具体文件的联系 即不能再通过fp对某个具体文件进行操作 12 如果在程序终止之前不关闭文件 将可能丢失缓冲区中最后一批未处理的数据 因为fclose函数的调用不仅释放文件指针 还刷新缓冲区 fclose函数将缓冲区中可能遗留的未装满送走的数据输入内存或输出至磁盘文件 以确保数据不丢失 当然 程序结束时会自动关闭文件 但用完文件后及时关闭是一个好的编程习惯 fclose函数也返回一个值 0表示顺利返回 非0表示关闭错误 13 10 2 4文件的读写 1 fputc函数和fgetc函数 fputc函数的调用形式为 fputc ch fp 该函数的作用是将字符 ch的值 输出到fp所指向的文件上去 其中ch是要输出的字符 它可以是一个字符常量 也可以是一个字符变量 fp是文件指针 它是从fopen函数得到的返回值 fputc函数也带回一个值 如果输出成功则返回值就是输出的字符 如果输出失败 则返回一个EOF EOF是在stdio h文件中定义的符号常量 值为 1 14 fgetc函数的调用形式为 ch fgetc fp 该函数的作用是从指定文件读入一个字符 该文件必须是以读或读写方式打开的 其中fp为文件型指针 指向所打开备读的文件 ch为字符变量 接收fgetc函数带回的字符如果在执行fgetc读字符时遇到文件结束符 函数则返回一个文件结束标志EOF 可以利用它来判断是否读完了文件中的数据 如想从一个磁盘文件顺序读入字符并在屏幕上显示出来 可编程为 while ch fgetc fp KG 4 EOF putchar ch 15 EOF不是可输出字符 因此在屏幕上显示不出来 由于字符的ASCII码不可能出现 l 因此EOF定义为 l是合适的 当读入的字符值等于 1 即EOF 时 表示读入的已不是正常的字符而是文件结束符 但以上只适用于读文本文件 现在标准C已允许用缓冲文件系统处理二进制文件 而读入某一个字节中的二进制数据的值有可能是 1 而这又恰好是EOF的值 这就出现了读入有用数据却被处理为 文件结束 的情况 即终止符设置不恰当 为了解决这个问题 标准C提供了一个feof 函数来判断文件是否真的结束 feof fp 用来测试fp所指向的文件当前状态是否为 文件结束 如果是文件结束 函数feof fp 的值为1 真 否则为0 假 16 例如 顺序读入一个二进制文件中的数据的程序段如下 while feof fp c fgetc fp 当未遇文件结束时 feof fp 的值为0 feof fp 为l 读入一个字节的数据赋给变量c 接着可做其它处理 之后再求feof fp 函数 循环工作直到文件结束 feof fp 值变为1 feof fp 值为0 结束while循环 这种方法也适用于文本文件 17 例10 1建立一个磁盘文件 将键入的回车前的若干个字符逐个写入该文件 include main FILE fp charch filename 13 printf nInputthefile sname gets filename 注1 if fp fopen filename w NULL printf Cannotopenthefile n exit 0 18 printf Inputthecharacterstothefile n while ch getchar n 注2 fputc ch fp 注3 putchar ch 注4 fclose fp 19 运行情况如下 Inputthefile sname fileex1 dat 注1要求的输入磁盘文件名 Inputthecharacterstothefile Whatinsidethefile 注2要求的键入一个字符串 Whatinsidethefile 注4输出到显示器上的字符串 与写入文件的内容一样 以资核对 程序运行之后 可以查看文件目录 将多出一个名为fileex1 dat的数据文件 可用DOS命令将其内容打印出来 typefileex1 dat Whatinsidethefile 由注3行循环写入的 20 2 fgets函数和fputs函数 fgets的作用是从指定文件读入一个字符串 如 fgets str n fp 从fp指向的文件读入n 1个字符 并把它们放到字符数组str中 如果在读入n 1个字符结束之前遇到换行符或EOF 读入即结束 字符串读入在最后加一个 0 字符 fgets函数返回值为str的首地址 fputs函数的作用是向指定的文件输出一个字符串 如 fputs China fp 21 3 fprinf函数和fscanf函数 fprintf函数 fscanf函数与printf和scanf函数作用类似 都是格式化读写函数 前二者的读写对象是磁盘文件 而后二者是终端设备 所以前二者函数调用参数中要多出一代表文件的文件指针 一般调用方式为 fprintf 文件指针 控制字符串 参量表 fscanf 文件指针 控制字符串 参量表 22 例10 2按格式键入字符型 整型 实型各一数 写入文件dform dat 再读出送显 include main inti i1 charch ch1 floatf f1 FILE fp printf nInputchif scanf c d f 23 if fp fopen dform dat w NULL 注1 printf Cannotopenthefile n exit 0 fprintf fp c 5d 4 1f ch i f 注2 fclose fp 注3 if fp fopen dform dat r NULL printf Cannotopenthefile n exit 0 fscanf fp c d f 24 程序运行情况 Inputchif a22 2 提示及输入 a22 2 屏幕显示 dform dat中的内容同屏显 25 4 fread函数和fwrite函数 它们的一般调用形式为 fread buffer size count fp fwrite buffer size count fp 其中 buffer是一个地址 对fread来说 它是读入数据将要存放处的地址 对fwrite来说 是要输出数据的地址 以上指的是起始地址 size是要读写的一个数据块的字节数 count是要进行读写数据块的个数 fp是文件指针 指向待读或写的文件 26 例10 3建立一个有关工人工资的数据文件 include defineSIZE6 structstaff charname 10 intsalary intcost worker SIZE voidsavef FILE fp inti if fp fopen work dat wb NULL 27 printf Cannotopenthefile n return for i 0 i SIZE i if fwrite 28 10 2 5文件的定位 1 rewind函数 rewind函数可以强制使当前工作指针指向文件的开头 一般在要重新从头读写文件时使用 如下例 在读了文件dfr dat一遍送显示器后 文件的位置指针已移到文件的最后 为了重新读一遍再写到文件dfw dat中 必须先执行一次rewind函数 才能正确读出 29 例10 4将已建好的文件dfr dat的内容顺序读一遍送显示器 再读一遍复制到文件dfw dat中 include main inti charch floatf f1 FILE fp1 fp2 if fp1 fopen dfr dat r NULL printf Cannotopenthefileforreading n exit 0 30 if fp2 fopen dfw dat w NULL printf Cannotopenthefileforwriting n exit 0 fscanf fp1 c d f 31 2 fseek函数 利用fseek函数可以控制文件位置的指针进行随机读写 fseek函数的调用形式为fseek 文件类型指针 位移量 起始点 起始点用0 1或2代表 0 文件的开始 1 当前位置 2 文件末尾 位移量指从起始点向前移动的字节数 fseek函数一般用于二进制文件 因为文本文件要发生字符转换 计算位置时容易发生混乱 32 例10 5将例10 3形成的职工数据文件中的第1 3 5个工人的信息读出 送显 include defineSIZE6 structstaff charname 10 intsalary intcost worker SIZE 33 main FILE fp inti if fp fopen work dat rb NULL printf Cannotopenthefile n exit 0 for i 0 i SIZE i i fseek fp i sizeof structstaff 0 fread 34 若形
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年整形美容科隆胸手术操作规范考核答案及解析
- 2025年心脏病学常见心律失常鉴别诊断模拟测试卷答案及解析
- 工程力学 课件 空间力系
- 2025年肿瘤内科多学科协作病例分析答案及解析
- 2025年神经病学帕金森病诊断标准模拟考试试卷答案及解析
- 2025年消化科学科肝硬化腹水引流术后护理注意事项模拟测验答案及解析
- 2025年内科病人护理技能考核试卷答案及解析
- 民族团结知识宣传课件
- 2025年影像学影像诊断解读技能考核试卷答案及解析
- 2025年遗传病学基因诊断技术考核测试卷答案及解析
- GB/T 7031-2025机械振动道路路面谱测量数据的报告
- 新材料研发开发合同
- 品质红线管理办法
- 新品开发管理办法
- 2025年高考考试大纲 地理(课标版)
- 2025年甘肃省高考地理试卷真题(含答案解析)
- 中小学校2025年秋季学期学校德育工作计划:“五维”聚力绘就学生品格成长新图景
- 手动葫芦吊装施工方案1
- 新生儿高胆红素血症的护理
- 甲状腺病人护理教学查房
- 中国化妆品市场调研及发展策略研究报告2025-2028版
评论
0/150
提交评论