南邮C语言程序设计课件第11章091115.ppt_第1页
南邮C语言程序设计课件第11章091115.ppt_第2页
南邮C语言程序设计课件第11章091115.ppt_第3页
南邮C语言程序设计课件第11章091115.ppt_第4页
南邮C语言程序设计课件第11章091115.ppt_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/7/23,1,C语言程序设计,第十一章 流与文件,主讲: 计算机学院 朱立华,2020/7/23,3,内容提要,本章介绍流与文件的有关知识: 什么是流,什么是文件,为什么需要文件 文件的两种类型:文本文件与二进制文件,数据的不同存储形式 文件操作需要用到的FILE类型,文件操作的基本步骤 重点是文件的几种读写方式: 字符的读写 字符串的读写 无格式读写 格式读写 文件的随机访问方式,重点是几个改变文件指针位置的函数的使用方法 两种用程序实现文件复制的方法,2020/7/23,4,流与文件的概念,流:数据的流动称为流,-数据流动总是和设备或外部介质有关 文件:与数据流动有关的设备和介质

2、统称为文件 已接触到的文件:源文件、目标文件、可执行文件等 还有什么需要用到文件?:之前所有程序的原始数据或者从键盘读入或者赋值;每次运行的结果未保存下来,下次想看结果必须再次运行程序。但是,程序中的原始数据、中间结果、最终结果有时需要以数据文件的形式保存下来并在程序中执行相关操作 文件操作解决的问题:通过运行程序,能实现数据文件的读写存储等操作,从而解决程序中的数据永久存储问题 文件操作的主要步骤:定义文件指针打开文件,读写,关闭,2020/7/23,5,文件指针,每一个文件对应一个文件指针,文件操作必须通过文件指针才能完成。 几个常用的文件指针:键盘-stdin,显示器-stdout,打印

3、机sprn 从键盘(stdin)和显示器(stdout)输入输出数据的操作通常将键盘文件和显示器文件省略了 字符、字符串、数值型变量的输入/输出用终端方式以及等效的文件输入输出方式对比如下:,char s10; /字符串 gets(s); puts(s);,char s10; /字符串 fgets(s,5,stdin); fputs(s,stdout);,int n; /整型 scanf(“%d”,int n; /整型 fscanf(stdin,“%d”,2020/7/23,6,文件指针,以下主要讨论磁盘文件,磁盘是一种外部介质,与键盘和显示器不同,它可以持久地保存数据。 专门存放数据的磁盘文

4、件我们称其为数据文件 流的数据组织形式分为字符序列和字节序列,前者称为文本流,后者称为二进制流。 例:double型常量136467.56789,如果是一个文本流,共占12个字节(一个字符对应一个ASCII码,每一个ASCII码占一个字节);如果是二进制流,共占8个字节 例:long int型常量100,如果是一个文本流,共占3个字节;如果是二进制流,共占4个字节 与文本流和二进制流对应的磁盘文件分别称为文本文件和二进制文件。,2020/7/23,7,文件的打开与关闭,并不是每一次读写文件操作都需要进行磁盘访问 读写操作的本质:每一次对磁盘的读写都要移动磁头,以寻找磁道扇区。若程序中的每一次读

5、写操作都对应一次实际的磁盘访问,则要花费很多读写时间,而且对磁盘的损耗大。 解决方案:系统在内存中为程序所需要的每一个文件开辟一个“缓冲区”:当程序从磁盘文件读取数据时,一次将一批数据送到(输入)缓冲区,然后将缓冲区的数据传给程序中的接收变量;如果向磁盘文件输出时,先将程序中的数据送到(输出)缓冲区,待缓冲区装满后,再一次传给磁盘文件。 FILE类型:读取一个文件需要许多信息,例如,与该文件对应的内存文件缓冲区的大小和地址、文件当前的读写位置、文件缓冲区中未处理的字符个数、文件使用方式等。这些信息存放在一个结构变量中,我们称此结构为文件类型,取名FILE。,2020/7/23,8,文件的打开与

6、关闭,File类型的定义: struct FILE short level;/文件缓冲区满或空的程度 unsigned flags;/文件状态标志 char fd;/文件描述符 unsigned char hold;/若无文件缓冲区,则不读取数据 short bsize;/文件缓冲区大小 unsigned char *buffer;/文件缓冲区的位置 unsigned char *curp;/指向文件缓冲区当前数据的指针 unsigned istemp;/临时文件指示器 short token;/用于有效性检验 ;,2020/7/23,9,文件的打开与关闭,程序用到一个文件,需要系统在内存建立

7、一个文件缓冲区,并返回一个文件类型变量的地址(FILE类型的指针),这是打开文件 打开文件通过调用fopen函数实现,原型为: FILE * fopen(char *filename,char *mode); 因此,程序首先需要定义一个FILE *指针来接收fopen函数的返回值,以后通过该指针对文件进行各种读写操作 例:FILE *fp; fp=fopen(D:records.txt,r); 如果文件打开成功,则返回一个有效地址值;如果打开失败则返回值为NULL(0),filemame表示磁盘文件名,mode代表文件使用方式,返回值为FILE*指针,带盘符路径的完整文件名,以r方式打开表示从

8、文件中读数据入内存,2020/7/23,10,文件的打开与关闭,重点是文件的打开方式,记住下面5个符号: r(意为read):打开一个已存在的文件以便从文件中读数据入内存,指针fp-curp定位于文件头;若文件不存在则打开失败返回0 w(意为write):建立一个新文件以便写数据入文件,指针fp-curp定位于文件头;若文件已存在则清空原文件,打开失败返回0 a(意为append):打开一个已存在的文件以便在原文件尾追加新的内容,指针fp-curp定位于文件尾;若文件不存在则相当于w的作用,打开失败返回0 +:作为前三个的后缀使用,表示打开之后既可读又可写 b(意为binary):作为前3个的

9、后缀使用,表示打开的是一个二进制文件,没有此后缀则默认打开的是文本文件,2020/7/23,11,文件的打开与关闭,因此5个符号组合起来共有12种打开方式: (1)r、w、a: 打开文本文件,只可读或只可写(追加) (2)r+、w+ 、a+:打开文本文件,既可读又可写(追加) (3)rb、wb、ab:打开二进制文件,只可读或只可写(追加) (4)rb+、wb+、ab+:打开二进制文件,既可读又可写(追加) 要保证打开文件正确才能执行后续操作,用如下代码: FILE *fp; fp=fopen(D:records.txt,r); if(!fp) /如果文件指针为0则打开失败 printf(can

10、t open file s.txt n); exit(1); ,FILE *fp; if(!(fp=fopen(D:records.txt,r),2020/7/23,12,文件的打开与关闭,文件打开后执行读写操作完毕, 需要释放文件缓冲区,这是关闭文件,所调用的函数原型为: int fclose(FILE *fp); 特别提醒:在执行写操作之后必须调用函数fclose,系统将在释放输出文件缓冲区之前,将其中最后一批还未充满该缓冲区的数据写入文件。因此,如果执行文件写操作之后没有关闭文件,可能丢失数据. fclose执行完毕后,文件指针与文件之间不再有关联 对标准输入文件(键盘)、标准输出文件(

11、显示器)和标准出错输出文件(显示器),都由系统自动打开和关闭。,成功关闭文件,返回0值,否则返回非0值,2020/7/23,13,文件的读写,根据文件读写操作涉及到的数据的类型和不同方式,分四组介绍: 字符的读写 字符串的读写 无格式读写 格式读写 (1)字符的读写:处理文本流(文本文件),文本流是字符序列,字符读写函数以字符为单位读写: int fputc(int c, FILE *fp); int fgetc(FILE *fp); 程序11.1 从键盘输入一段文本,存储到文本文件D:poem.txt中(fputc的应用),将字符c写入流,指针fp-curp后移一个字节,。若成功则返回c,否

12、则返回EOF(-1),fgetc 从流中读取一个字符返回, 指针fp-curp后移一个字节,读到结尾标志返回EOF,2020/7/23,14,文件的读写字符读写,程序11.1的几点说明: (1)该程序运行后,屏幕上无任何输出,读入的内容写入到了文件D:poem.txt中 (2)该文本文件的显示方式有多种: 在VC+下直接用文件中的打开命令可以在客户区中显示 回到操作系统的“资源管理器”或“我的电脑”,打开D盘,再用鼠标左键双击打开“poem.txt”,就可以在默认的记事本中显示文件内容 进入到“命令提示符”状态键入命令:type d:poem.txt,就可以在DOS界面下显示文件内容。 通过程

13、序11.2,打开该文件,读出文件中的内容,在显示器显示。,2020/7/23,15,文件的读写字符读写,程序11.2:从文件D:poem.txt读出文本,在显示器上输出。 几个关键性问题: (1)打开文件时一定要判断是否正确打开,注意要保证相应的路径中一定存在该文件 (2) 正确判断一个文件是否结束有两种方式 一种是根据当前读到的字符是否为EOF(-1) 另一种是用feof(fp)函数判断指针fp-curp是否已指在文件尾 ,关键语句: while(ch=fgetc(fp)!=EOF) putchar(ch); /输出该字符 ,如果当前读入的字符不是文件结尾标志,动态演示展示的是与此段代码等效

14、的控制方式,注意比较,函数feof的作用是判断文件是否结束,结束返回1,未结束返回0,2020/7/23,16,文件的读写字符串读写,(2)字符串的读写:处理文本流(文本文件),文本流是字符序列,字符串读写函数以字符串为单位读写: int fputs(char *s, FILE *fp); char *fgets(char *s, int n, FILE *fp); 关于fgets函数再作几点说明: 若遇回车符或文件结束符之前,已读取了n-1个字符,则读取结束,加上串结束符0组成字符串,存入s指向的内存区 若提前遇到换行符,则读取结束,在换行符后加上串结束符0组成字符串,存入s指向的内存区。

15、若提前遇到文件结束符,则读取结束,将文件结束符换为串结束符0组成字符串存入s指向的内存区。 若读入正常结束,则返回值是字符串指针s,否则返回空指针值NULL。,将字符串s舍去串结束符0之后从fp-curp所指的当前位置写起,错误时返回EOF(-1),否则返回一个非负数。,从fp-curp位置开始最多读取n-1个字符存入串s,串末加0,正常读取返回s的位置,否则返回 NULL(0),2020/7/23,17,文件的读写字符串读写,程序11.3:从文件D:poem.txt逐行读入文本,在显示器上输出。 几个关键性问题: (1)打开文件时一定要判断是否正确打开,注意要保证相应的路径中一定存在该文件

16、(2) 正确判断一个文件是否结束有两种方式 一种是读入一个字符串,返回值是否非空 另一种是用feof(fp)函数判断指针fp-curp是否已指在文件尾 .关键语句: while(fgets(s,256,fp)!=NULL) printf(“%s”,s); /输出该字符串 ,动态演示展示的是与此段代码等效的控制方式,注意比较,2020/7/23,18,文件的读写无格式读写,(3)无格式读写也称为按数据块读写,主要用于处理二进制流(二进制文件)。二进制流是字节序列,将字节序列分段截取,每一段代表一个数据元素 int fwrite(const void *buffer, int size, int

17、n, FILE *fp); int fread(void *buffer, int size, int n, FILE *fp); 读写操作之后,指针fp-curp自动后移,准备下一次读写。 程序11.4 从键盘输入一批学生记录,存储到文件D:st.rec中 几个关键性问题: (1)定义结构体类型表示学生记录 (2) 打开文件并判断是否正确打开 (3)从键盘上逐条记录输入,逐条记录写入文件,从程序数据区地址buffer开始,将连续size个字节的内容作为一个字段,一共n个字段写入fp-curp指向的缓冲区,返回值是实际写入的数据块个数,从fp-curp指向的缓冲区,将连续size个字节的内容作

18、为一个字段,一共n个字段从文件中读出写入buffer指向的空间,返回值为实际读到的数据块个数。,2020/7/23,19,文件的读写无格式读写,程序11.4结果分析: (1)运行该程序,屏幕不产生输出,结果写入到磁盘文件中 (2) 以查看文本文件的几种方式打开看磁盘文件,有乱码,二进制文件与文本文件不同,无法直接查看 (3)如果想读二进制文件内容,编程实现,将文件内容读到内存变量中,再通过输出内存变量值的方式实现,注意类型一致性 程序11.5:从文件D:st.rec中读取记录在显示器显示 几个关键性问题: (1)定义结构体类型表示学生记录,与11.4中的类型一致 (2) 打开文件并判断是否正确

19、打开 (3)从文件中逐条读出记录及时判断是否正确读出,再输出,2020/7/23,20,文件的读写格式读写,(4)标准输入输出函数scanf和printf实际上就是键盘文件(stdin)和显示器文件(stdout)上的格式读写 磁盘文件的格式读写与上述两个函数类似,只是要指明文件指针而不能缺少,函数名前面加f,具体地: int fscanf(FILE *fp,const char* format,地址1, 地址2); int fprintf(FILE *fp,const char* format,输出参数1, 输出参数2); 读写操作之后,指针fp-curp自动后移,准备下一次读写。 程序11

20、.6:格式读写示例,从磁盘文件D:st.txt读入数据,然后在显示器上输出。 说明:此文本文件需事先建立,每行对应一条学生记录,从fp读入数据给相应变量,其余参数和返回值与scanf完全一样,向fp写入数据,其余参数和返回值与printf完全一样,2020/7/23,21,文件的读写格式读写,程序11.6 结果分析: (1)该程序运行时,无需从键盘上读入任何数据,直接从文件中读信息然后输出 (2)该程序需要事先建立文本文件,可以直接用记事本建立,也可以事先编程用fprintf输入每条学生记录建立 (3)与程序11.5相比较,对应于记录的文件可以是二进制文件,也可以是文本文件;如果是二进制文件,

21、一般对应用fread和fwrite函数进行读写;如果是文本文件,一般对应用fscanf和fprintf函数进行读写 (4)究竟用文本文件还是二进制文件更好?这要取决于用户需求,如果希望以普通方式打开直接查看到文件内容,则用文本文件;如果希望读写操作时的效率更高,则采用二进制文件,因为对数据不存在格式上的转换,2020/7/23,22,文件的随机访问,前面介绍的各种文件操作都是按顺序读写的,各种文件读写函数在操作结束后指针fp-curp会自动后移,以便下一次执行读写操作。 要实现文件随机访问的最根本点:指针fp-curp可以按需要任意移动到指定位置,因为读写操作总是从fp-curp指针位置开始的

22、 几个改变文件指针位置的函数: int rewind(FILE *fp); int fseek(FILE *fp,long offset,int from); long ftell(FILE *fp);,该函数用于定位指针fp-curp,使其指向文件头,该函数用于指针fp-curp随机定位,可以将指针fp-curp从from起始位置移动offset指定的字节数,指向新的位置。,0(字符常量是SEEK_SET)表示起始位置是文件头; 1(字符常量是SEEK_CUR)表示起始位置是当前位置;2(字符常量是SEEK_END)表示起始位置是文件尾,正数:表示向文件尾移动; 0:表示回到起始位置(第三参数所指位置); 负数:表示向文件头移动。,返回指针fp-curp相对文件头的当前位置,返回值-1L表示出错。,2020/7/23,23,文件的随机访问,其他几个常用的文件函数: int feof(FILE *fp); int ferror(FILE *fp);long ftell(FILE *fp); void clearer(FILE *fp); 程序11.7 将文本文件D:poem.txt中的小写字母改为大写字母。(在VC+下直接运行) 几个关键性问题: (1)文件的打开方式应为r+,读为主但允许写入,并判断是否正确打开 (2)每读出一个字符进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论