




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章文件 2020 2 23 10 1文件概述 10 3文件的打开与关闭 10 5文件定位函数 本章内容 10 2文件指针 10 4文件的读写 10 6本章小结 在程序运行时 程序本身和数据一般都存放在内存中 会随系统断电而丢失 当程序运行结束后 存放在内存中的数据被释放 如果需要长期保存程序运行所需的原始数据或程序运行产生的结果 就必须以文件形式存储到外部存储介质 如磁盘 光盘 硬盘 上 这种永久保存的最小存储单元为文件 因此文件管理是计算机系统中的一个重要的问题 10 1 1文本文件文本文件是一种典型的顺序文件 其文件的逻辑结构又属于流式文件 特别的是 文本文件是指以ASCII码方式 也称文本方式 存储的文件 10 1 2二进制文件文件作为信息存储的一个基本单位 根据其存储信息的方式不同 分为文本文件 又名ASCII文件 和二进制文件 如果将存储的信息采用字符串方式来保存 那么称此类文件为文本文件 如果将存储的信息严格按其在内存中的存储形式来保存 则称此类文件为二进制文件 10 1文件概述 在C语言中用一个指针变量指向一个文件 这个指针称为文件指针 通过文件指针就可对它所指的文件进行各种操作 定义说明文件指针的一般形式为 FILE 指针变量标识符 其中 FILE应为大写 它实际上是系统定义的一个结构 该结构中含有文件名 文件状态和文件当前位置等信息 在编写源程序时不必关心FILE结构的细节 例如 FILE fp 在进行读写操作之前要先将文件打开 使用完毕要关闭文件 10 2文件指针 10 3文件的打开与关闭 打开名为 a txt 的文件 并向文件输出字符串 ThisismyCprogram 然后关闭文件 同时在屏幕上输出fclose 的返回值 应该怎么设计呢 如果需要将程序运行结果存放外存时 应该用什么方法存储呢 应该怎样读入数据或存储数据 打开文件的操作可以用fopen 函数 写入文件有多种方式 以后章节将详细介绍 注意在文件处理的最后调用fclose 函数关闭文件 在关闭文件之后 不可再对文件进行读写操作 程序清单如下 include stdio h voidmain FILE fpFile intnStatus 0 if fpFile fopen a txt w NULL printf 文件打开失败 n exit 0 fprintf fpFile s ThisismyCprogram fclose fpFile getch 10 3 1文件打开骤进行文件处理时 首先要打开一个文件 在C语言中 所谓打开文件 实际上是建立文件的各种有关信息 并使文件指针指向该文件 以便进行其他操作 在C语言中 文件的打开操作是通过fopen 函数来实现 此函数的声明在 stdio h 中 原型如下 FILE fopen constchar path constchar mode 函数形式参数说明如下 1 constchar path 文件名称 用字符串表示 2 constchar mode 文件打开方式 同样用字符串表示 3 函数返回值 FILE类型指针 如果运行成功 fopen返回文件的地址 否则返NULL 应当注意 检测fopen 函数的返回值 防止打开文件失败后 继续对文件进行读写而出现严重错误 根据不同的需求 文件的打开方式有如下几种模式 1 只读模式 只能从文件读取数据 也就是说只能使用读取数据的文件处理函数 同时要求文件本身已经存在 2 只写模式 只能向文件输出数据 也就是说只能使用写数据的文件处理函数 3 追加模式 一种特殊写模式 如果文件存在 则准备从文件的末端写入新的数据 文件原有的数据保持不变 4 读写模式 可以向文件写数据 也可从文件读取数据 此模式下有如下的几个参数 r rb 要求文件已经存在 如果文件不存在 则打开文件失败 文件打开模式对应表如表10 1所示 注意 文件打开模式参数为字符串 不是字符 另外 对不同的操作系统或不同的C语言编译器 文件打开模式参数可能不同 10 3 2文件关闭 在C语言中 在文件操作完成之后要关闭文件 关闭文件则是指断开指针与文件之间的联系 也就是禁止再对该文件进行操作 在C语言中 文件的关闭是通过fclose 函数来实现 此函数的声明在 stdio h 中 原型如下 intfclose FILE stream 函数形式参数说明如下 1 FILE stream 打开文件的地址 2 函数返回值 int类型 如果为0 则表示文件关闭成功 否则表示失败 文件处理完成之后 最后的一步操作是关闭文件 保证所有数据已经正确读写完毕 并清理与当前文件相关的内存空间 在关闭文件之后 不可以再对文件进行读写操作 除非再重新打开文件 10 4文件的读写 设计一个程序 将字符Thisisatesttxtfile Ok Q写入文件 c test txt 中 然后再从文件 c test txt 中读出所有的字符并显示在屏幕上 要能从键盘上读取字符 再输出到 text txt 文件中 必须要先将从键盘输入的内容先存到内存 再通过写入文件函数写入到文件中 要能在屏幕上显示文件的内容 也是同样的道理 应先将文件内容读入到内存 再通过以前的输出函数输出到屏幕上 程序清单1 include stdio h voidmain FILE fpFile charc if fpFile fopen c test txt w NULL printf 文件打开失败 n exit 0 while c getchar Q fputc c fpFile fclose fpFile 程序清单2 include stdio h voidmain FILE fpFile charszFileName 20 intc printf 请输入文件名字 n scanf s szFileName if fpFile fopen szFileName w NULL printf 文件打开失败 n exit 0 while c fgetc fpFile EOF putchar c fclose fpFile 程序运行结果如下 输入 Thisisatesttxtfile Ok Q文件c test txt的内容如下 Thisisatesttxtfile Ok 程序运行结果如下 请输入文件名字 c test txt输出 Thisisatesttxtfile Ok 10 4 1字符的读写fputc 与fgetc 函数和标准输入输出函数getchar 与putchar 类似 其 stdio h 中的原型如下 intfputc intc FILE stream intfgetc FILE stream fputc 函数的作用是从当前文件位置开始向文件输出一个字符 函数说明如下 1 intc 准备输出的字符 2 FILE stream 文件地址 为FILE 类型变量 3 函数返回值 int类型 如果返回值为 1 EOF 则表示字符输出失败 否则返回值为c 即与输出的字符相等 Fgetc 函数的作用是从当前文件位置读取一个字符 函数形式参数说明如下 1 FILE stream 用读写模式和只读模式打开的文件地址 为FILE 类型变量 2 函数返回值 int类型 如果返回值为 1 表示已经读到文件末尾 否则返回读到的字符 10 4 2格式化读写 文件输入输出函数中提供了与scanf 和printf 类似的函数 fscanf 和fprintf 其在 stdio h 中的原型如下 intfprintf FILE stream constchar format intfscanf FILE stream constchar format 对比intprintf constchar format intscanf constchar format 发现 文件输入输出函数中仅仅多了形式参数FILE stream 即文件地址 其他的形式参数完全相同 例如 scanf d d 的作用是从键盘中读取一个整型数据到变量d中 fscanf stream d d 的作用是从当前打开的文件中读取一个整型数据到变量d中 例10 1 从键盘读入5位同学的姓名 数学成绩 物理成绩和化学成绩 并计算总分后输出到文本文件 student dat 中 分析 要求从键盘上输入5位同学的信息并求出总分到文件中 首先得从键盘上输入信息存到变量中 再由变量存到文件中 即先用scanf 函数输入到变量 并算出总分 再用fprintf 写入到文件中 程序清单如下 include stdio h voidmain FILE fpFile floatfPhyscial fMath fChemical floatfTotal charszName 20 inti if fpFile fopen student dat w NULL printf 文件打开失败 n exit 0 Printf 请输入信息 n printf 姓名 t物理 t数学 t化学 n for i 0 i 5 i scanf s f f f szName 程序运行结果如下 请输入信息 姓名物理数学化学John78 5085 5090 00Bob89 5091 0082 00Lili82 5090 0087 00您所写入到文件的内容是 姓名物理数学化学总分John78 5085 5090 00254 00Bob89 5091 0082 00262 50Lili82 5090 0087 00259 50 10 4 3块的读写 文件输入输出函数中还提供了块的输入输出函数 即将内存中的一段信息作为一个整体进行输入输出操作 其在 stdio h 中的原型如下 size tfread void ptr size tsize size tn FILE stream size tfwrite constvoid ptr size tsize size tn FILE stream 其中size t在 stdio h 中的定义如下 typedefunsignedsize t 函数说明如下 1 void ptr 数据在内存中的首地址 可以为任何类型的指针变量 在fread 函数中此参数为输出参数 必须输入有效的内存地址 并有足够的内存空间 在fwrite 函数中 其为输入参数 仅仅要求输入有效的内存地址 2 size tsize 块数据的大小 以字节为单位 3 size tn 块数据的数量 以字节为单位 4 FILE stream 已经打开文件的地址 5 函数的返回值 size t类型 如果函数运行成功 则返回块数据的大小 否则返回0 例10 2 从键盘读取10个整型数据存储到文件中 然后再从文件中读取数据 并输出到屏幕 首先得从键盘上输入数据存到数组变量中 再通过fwrite 函数将数组变量的内容写到文件中 再用fread 函数读出到数组中 此题不用再次读取也可直接输出到屏幕上 最后用printf 输出数组内容 程序清单如下 includeintmain FILE fpFile intnArray 10 inti if fpFile fopen data dat w NULL printf 文件打开失败 n exit 0 i 0 printf 请输入10个数 n while i 10 scanf d 程序运行结果如下 请输入10个数 1234567890您所存储的数是 1234567890 10 4 4字符串的读写 在文件输入输出函数中还提供了与gets 与puts 类似的字符输入输出函数 其原型如下 char fgets char s intn FILE stream intfputs constchar s intnFILE stream fgets 函数说明如下 1 char s 有效内存地址 以便可以存储从文件读取的字符串 2 intn 读取字符串的长度 确定从文件中读取多少个字符 实质上 此函数从文件中读取n 1个字符到当前的字符串中 然后自动添加字符串结束符 0 但是如果此文件中一行长度小于n 则到此行的换行符为止 并将此换行符读取到字符串中 3 FILE stream 文件地址 4 函数返回值 字符串首地址 如果函数运行成功 则返回s的值 否则返回NULL Fputs 函数说明如下 1 constchar s 有效的字符串 此字符串中不包括 n 2 intn 字符串长度 实质上 在向文件输出信息时 并不输出 0 3 FILE stream 文件地址 4 函数返回值 整型数据 如果函数运行成功 则返回0 否则返回EOF 例10 3 从student c文件中读入一个学生的姓名 然后在student txt文件中追加一个字符串 根据题意 由于要追加字符串到已有文件中 因此必须用 ab 的方式打开文件 再用fgets 函数读入一个学生的姓名 然后通过scanf 或gets 从键盘中输入要写入文件中的字符串 最后关闭文件 程序清单如下 main FILE fp charstr 10 ch clrscr if fp fopen c turboc2 unit10 student txt ab NULL printf 文件打开失败 按任意键结束 getch exit 1 fgets str 10 fp printf s n str printf 请输入字符串 n scanf s str fputs str fp rewind fp 将文件的位置指针指向文件的开始位置 printf 您添加数据后的文件内容是 n while ch fgetc fp EOF putchar ch printf n fclose fp getch 程序运行结果如下 eileen 从文件student txt中读取的姓名字符串 请输入字符串 提示信息 shining 打算追加到文件的字符串 您添加数据后的文件内容是 提示信息 eileenshining 写入后文件的内容 10 5文件定位函数 请读取 c turboc2 unit10 student txt 文件中第奇数个学生的信息并输出 首先使用fopen 函数以二进制只读 rb 的方式打开该文件 然后采用重定函数对文件的指针进行定位 每次指针位置移动两个结构体大小 直到全部输出为止 程序清单如下 structstudent 结构体的定义 intnum charname 20 intchinese math english main FILE fp inti charch filename 30 floatf structstudentstu 30 定义结构体数组 clrscr printf n请输入文件名字 scanf s filename 从键盘读入文件名 if fp fopen filename rb NULL 以只读方式打开文件 printf 不能打开 s文件 n filename exit 0 printf n学生成绩信息是 printf n学号姓名语文数学英语 n for i 0 i 3 i 2 fseek fp i sizeof structstudent 0 对文件指针进行重定位 fread 程序的运行结果如下 请输入文件名字 c turboc2 unit10 student txt学生成绩信息是 学号姓名语文数学英语 1Jacob8966943eileen907588 10 5 1fseekfseek 函数是最重要的文件定位函数 此函数在 stdio h 中的原型如下 intfseek FILE stream longoffset intwhence 函数的形式参数如下 1 FILE stream 文件地址 2 longoffset 文件指针偏移量 3 intwhence 偏移起始位置 4 函数返回值 非零值表示是成功 零表示失败 另外fseek 将指针移动到文件的开始和结束位置时 产生一个文件状态标志 必须使用clearerr 函数清除文件状态标志后 才可以继续读写此文件 将文件指针移动到文件开始位置的程序如下 FILE fp fseek fp 0L SEEK SET 将文件指针移动到文件末尾位置的程序如下 fseek fp 0L SEEK END 10 5 2rewind rewind 函数的作用是将当前文件指针重新移动到文件的开始位置 此函数在 stdio h 中的原型 voidrewind FILE stream 函数的形式参数如下 1 FILE stream 文件地址 2 函数返回值 无 此函数的作用相当于如下的程序 将文件指针移动到文件头 并清除状态标志 fseek fp 0L SEEK SET clearerr fp 10 5 3ftell ftell 函数用来检测当前位置指针的位置即检测流式文件中当前位置指针的位置距离文件头有多少个字节的距离 此函数在 stdio h 中的原型 longftell FILE stream 函数说明如下 1 FILE stream 文件地址 2 成功则返回实际位移量 长整型 否则返回 1L i ftell fp if i 1L printf Error n 利用这个函数 我们也可以测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东统考卫生真题及答案
- 2025年商务礼仪综合试题及答案
- 2024年床头末端装置项目项目投资申请报告代可行性研究报告
- 天津市2025年传统医学师承出师考核师承出师和确有专长人员考核复习题及答案
- 深圳市职业卫生技术服务专业技术人员考试(职业卫生检测)模拟题库及答案(2025年)
- 2025年索道维修面试题及答案
- 2025年光伏发电运维安规考试试题及答案
- 贵州省2025年医师资格考试医学综合考试“年两试”临床执业医师练习题及答案
- 2025税法的考试题库及答案
- 河北省2025年度下半年医师执业注册考核公卫执业医师练习题及答案
- 病房管理知识汇总
- 师德师风考核表
- 噬血细胞综合征课件护理查房
- 头颈部鳞癌治疗现状及免疫治疗进展
- 微信小程序开发-微信小程序云开发
- 书写板卫生安全要求
- 中成药合理使用
- GB/T 30193-2013工程机械轮胎耐久性试验方法
- GB/T 23260-2009带自粘层的防水卷材
- GA 1551.6-2021石油石化系统治安反恐防范要求第6部分:石油天然气管道企业
- GA 1732-2020警用无人驾驶航空器外观制式涂装规范
评论
0/150
提交评论