




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章文件 10 1文件概述10 1 1文件从操作系统的概念看 文件是指存放在外存储器上的信息的集合 文件名称是由文件名和扩展名两部分组成的 从广义上讲 文件是指信息输入和输出的对象 磁盘文件 键盘 CON 显示器 打印机 PRN 等均可视为文件 将物理设备看做是一种逻辑文件 用与磁盘文件操作相同的命令进行操作的做法 可以简化程序设计 10 1 2常用的文件类型 1 以字符形式存储 称为字符文件或文本文件 2 以二进制代码形式存储 称为二进制文件例如 2978这个整数 在字符文件中用其ASCII码表示为 2 9 7 8 而在二进制文件中 该数表示成相应的二进制数字 101110100010 一般来说 二进制文件节省存储空间 并且由于在输入时不需要把字符代码先转换成二进制形式再送入内存 在输出时也不需要把数据由二进制形式转换为字符代码再输出 因而输入输出速度快 用户程序在实用中 从节省时间和空间的要求考虑 一般选用二进制文件 但是如果用户准备的数据是作为文档使用阅读的 则一般使用字符文件 它们可以方便 快捷的通过显示器或打印机直接输出 系统定义了5个FILE结构指针变量 它们如下表 10 1 3C语言的输入输出操作由于相对于内存储器而言 磁盘是慢速设备 在C语言的文件操作中 如果每向磁盘写一个字节或读出一个字节的数据 都要启动磁盘操作 将会大大降低系统的效率 而且还会对磁盘驱动器的使用寿命带来不利影响 为此在文件系统中使用缓冲技术 即系统在内存中为每一个正在读写的文件开辟一个 缓冲区 利用缓冲区完成文件读写操作 程序数据区 输入缓冲区 内存 磁盘文件 程序数据区 输出缓冲区 内存 磁盘文件 a 读磁盘文件 b 写磁盘文件 这种利用缓冲区将对磁盘文件的频繁逐次访问变为批量访问的做法称为标准文件操作 对应的磁盘文件系统称为缓冲文件系统 也称标准文件系统或高层文件系统 不使用缓冲区的磁盘文件系统称为非缓冲文件系统 也称非标准文件系统或低层文件系统 10 1 4文件存取方式 标准I O提供了4种文件存取方法 1 读写一个字符 2 读写一个字符串 将多个字符组成的字符串写入文件或从文件中读出 3 格式化读写 根据格式控制指定的数据格式对数据进行转换存取 4 成块读写 也称作按记录读写 C语言的文件虽然是按字节流存放 但可以按记录存取多个字节的数据 10 2文件操作 10 2 1文件结构指针FILE数据结构一般定义在stdio h头文件中 定义如下 typestruct shortlevel unsignedflags charfd unsignedcharhild shortbsize unsignedchar buffer unsignedchar curp unsignedistemp shorttoken FILE FILE fp 定义了一个FILE结构体指针变量 当程序打开一个文件 就得到对应FILE结构指针 只要把该指针赋给指针变量fp fp就指向了这个FILE结构体变量 也就是指向这个文件了 10 2 2标准文件的打开操作C语言程序标准文件的打开操作用fopen 函数实现 调用格式为 FILE fopen char filename char mode fopen 打开一个filename指向的文件 文件操作方式由mode的值决定 例如 fopen datafile dat r 表示打开名为datafile dat的文件 文件操作方式设定为 只读 如果文件打开成功 返回一个指向该文件的指针 如果不成功 返回一个NULL值 if fp fopen file1 r NULL printf file1cannotbeopened n exit 0 下面的程序打开一个由路径指明的文件 FILE fp if fp fopen c chen student1 dat wb NULL printf Filecannotbeopened n exit 1 else printf Fileopenedforwriteingandreading n 说明 1 r 只能从文件读取 并且文件要存在 否则出错 打开时 指针移到文件开头 2 w 只能写入数据到文件 若文件存在 则删去重新创建 若不存在 则新建一个 3 a 添加数据 若文件不存在 则新建 否则打开时 文件位置指针移到文件末尾 4 r w a 5 rb wb ab rb wb ab 10 2 3关闭标准文件关闭标准文件用fclose 函数 intfclose FILE stream 例 fclose fp1 它表示该函数将关闭FILE结构指针变量fp1对应的文件 并返回一个整数值 若成功地关闭了文件 则返回一个0值 否则返回一个非零值 下面是一个测试关闭文件成功与否的程序段if fclose fp2 0 printf nFilecannotbeclosed exit 1 elseprintf nFileisnowclosed 另有一个fcloseall 函数 它可以同时关闭程序中已打开的多个文件 将各文件缓冲区未满的内容写到相应的文件中去 随着便释放这些缓冲区 并返回关闭文件的数目 例如 若程序已打开3个文件 当执行n fcloseall 时 这3个文件将同时被关闭 且使n的值为3 10 2 4文件读写操作1 读写文件中字符的函数intfgetc FILE stream 例 ch fgetc fp1 如果到达文件尾 返回EOF 否则返回字符 intfputc intch FILE stream 例 fputc ch fp1 成功返回被输出的字符 否则就返回EOF 例10 1编程实现读出磁盘文件datafile txt中的内容 将它们显示在屏幕上 voidmain FILE fp charch if fp fopen datafile txt r NULL printf filecannotbeopened n exit 1 while ch fgetc fp EOF fputc ch stdout fclose fp 例10 2编程完成 从键盘输入字符后 写入到磁盘文件datafile1 txt中 voidmain FILE fp1 charstr1 if fp1 fopen datafile1 txt w NULL printf filecannotbeopened n exit 1 while str1 fgetc stdin n fputc str1 fp1 fclose fp1 为了编程时书写方便 一些C版本把fgetc 和fputc 函数定义为宏名getc 和putc 即 definegetc fp fgetc fp defineputc ch fp fputc ch fp definegetchar fgetc stdin defineputchar ch fputc ch stdout 3 文件的字符串读函数char fgets char str intn FILE stream 从指针stream指定的文件中读取n 1个字符 把它送到由指针str指向的字符数组中 例 fgets databuf 6 fp fgets 读完指定的n 1个字符后返回 若在读入n 1个字符完成之前就遇到换行符 n 或文件结束符EOF 也将停止读入 但将遇到的 n 也作为一个字符送入字符数组中 fgets 在读入字符串之后会自动添加一个串结束符 0 因此送入字符数组中的字符串 包括 0 在内 最多为n个字节 feof函数原型 intfeof FILE fp 功能 判断文件是否结束返值 文件结束 返回真 非0 文件未结束 返回0 例10 3编程完成 逐行读出datafile2 txt文件中的字符并显示出来 voidmain FILE fp2 charbuffer 64 if fp2 fopen datafile2 txt r NULL printf can topenfile n exit 1 while feof fp2 if fgets buffer 64 fp2 NULL printf s buffer fclose fp2 4 文件的字符串写函数fputs char fputs char str FILE stream 函数fputs 把由str指针指明的字符数组中的字符串写入由指针stream指定的文件中 该字符串以空字符 0 结束 但此字符将不写入到文件中去 该函数正确执行后 将返回写入的字符数 当出错时将返回 1 例No1 c从键盘输入若干行字符 把它们添加到磁盘文件datafile3 txt中 voidmain FILE fp3 charbuffer 64 if fp3 fopen datafile3 txt a NULL printf can topenfile n exit 1 while strlen fgets buffer 64 stdin 1 fputs buffer fp3 fputs n fp3 fclose fp3 5 格式化读写函数fscanf FILE stream char format fprintf FILE stream char format 其中 char format表示输入输出格式控制字符串 格式控制字符串的格式说明与scanf 函数和printf 函数的格式说明完全相同 表示输入输出的参量表 例10 4从键盘输入字符信息及数组信息后 用格式化方式写入磁盘文件中 for i 0 i1 fprintf fp6 s d f str age sum printf typestr age sum scanf s d f str 2009 3 有以下程序 includemain FILE f f fopen filea txt w fprintf f abc fclose f 若文本文件filea txt中原有内容为 hello 则运行以上程序后 文件filea txt的内容为A helloabcB abcloC abcD abchello C 2008 4 有以下程序 includemain FILE fp inta 10 1 2 3 i n fp fopen d1 dat w for i 0 i 3 i fprintf fp d a i fprintf fp n fclose fp fp fopen d1 dat r fscanf fp d 程序的运行结果是A 12300B 123C 1D 321 B 11 2 5标准文件的随机读写顺序读写 按文件的物理顺序逐个地读写数据项随机读写 可以任意指定读写位置的文件操作解决方案 只要能移动文件指针到所需要的地方 就可实现文件的随机读写 1 文件指针定位函数intfseek FILE stream longoffset intorigin fseek使文件指针移动到所需的位置 1 stream指定需要操作的文件 2 offset是位移量 为正数代表从文件开头向文件尾移动 若为负数 则相反 3 origin指明以什么地方为基准进行指针移动 fseek fp 10L SEEK SET fseek fp 10L 0 fseek fp 20L SEEK END fseek fp 5L 1 fseek 函数调用成功 返回值为0 否则返回一个非零值 longftell FILE stream 用于得到文件指针离开文件起点的偏移量 即偏移的字节数 如果函数调用出错 例该文件不存在 则函数的返回值为 1 rewind FILE stream 用于把文件指针移到文件的开头 移动成功时 返回值为0 否则返回一个非零值 例10 5用fseek 函数完成定位读操作 voidmain FILE fp7 charbuf 32 if fp7 fopen datafile7 txt rb NULL printf Filecannotbeopened n exit 1 fseek fp7 64L SEEK SET fgets buf 32 fp7 puts buf fclose fp7 2 文件随机读写函数intfread void ptr intsize intcount FILE stream intfwrite void ptr intsize intcount FILE stream 功能 读 写数据块返值 成功 返回读 写的块数 出错或文件尾 返回0其中ptr指针指向内存缓冲区 count为数据项个数 每个数据项的长度为size个字节 stream是文件指针变量 fread与fwrite一般用于二进制文件的输入 输出 例floatf 2 FILE fp fp fopen aa dat rb fread f 4 2 fp for i 0 i 2 i fread 例structstudent intnum charname 20 charsex intage floatscore 3 stud 10 for i 0 i 10 i fread 例从键盘输入4个学生数据 把他们转存到磁盘文件中去 include defineSIZE2structstudent type charname 10 intnum intage charaddr 15 stud SIZE main inti for i 0 i SIZE i scanf s d d s stud i name voidsave FILE fp inti if fp fopen stu dat wb NULL printf cannotopenfile n return for i 0 i SIZE i if fwrite voiddisplay FILE fp inti if fp fopen stu dat rb NULL printf cannotopenfile n return for i 0 i SIZE i fread 2008 9 有以下程序 includemain FILE pf char s1 China s2 Beijing pf fopen abc dat wb fwrite s2 7 1 pf rewind pf fwrite s1 5 1 pf fclose pf 以上程序执行后abc dat文件的内容是A ChinaB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甲流的危害课件
- 《棉花姑娘》教学课件
- 佳音英语教学课件
- 一故事一音标教学课件
- 用水安全基础知识培训课件
- 生物安全基础知识培训课件
- 2025年注册电气工程师考试电路分析模拟试卷 基础知识专项训练
- Ⅳ期压疮足跟部护理查房记录
- 2025至2030药房管理系统行业项目调研及市场前景预测评估报告
- 2025至2030中国甘蔗收获机行业产业运行态势及投资规划深度研究报告
- 2023-2024学年北师大版小学数学一升二开学摸底考试测试卷及答案(共三套)
- 七下科学第四章知识点
- 全国灌溉水有效利用系数测算分析技术指导细则(2024修订版)知识培训
- 起搏器围手术期的护理
- 2025年中国建设银行信用贷款协议
- 不锈钢栏杆、扶手合同范本
- 《常见精神障碍诊断与治疗》课件
- 污水处理厂运营与管理经验分享
- 2025年咖啡粉末香精项目可行性研究报告
- 某露天矿山剥离工程施工组织设计方案
- 2024年江苏省中职职教高考文化统考农业(养殖)专业综合理论试卷及参考答案
评论
0/150
提交评论