C语言程序设计课件第章人民邮电出版社.ppt
《C语言程序设计课件第章人民邮电出版社.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第章人民邮电出版社.ppt(28页珍藏版)》请在冰豆网上搜索。
,级,高,语,言,设,计,程,序,2009.8朱立华俞琼王立柱,1,章节自测及在线编程练习:
http:
/,主讲人:
朱立华,2009.8朱立华俞琼王立柱,2,2009.8朱立华俞琼王立柱,3,2009.8朱立华俞琼王立柱,4,内容提要,两种用程序实现文件复制的方法,本章介绍流与文件的有关知识,内容提要,2009.8朱立华俞琼王立柱,5,重点难点提示,重点难点提示,2009.8朱立华俞琼王立柱,6,流与文件的概念,流:
数据的流动称为流,-数据流动总是和设备或外部介质有关文件:
与数据流动有关的设备和介质统称为文件已接触到的文件:
源文件、目标文件、可执行文件等还有什么需要用到文件?
:
之前所有程序的原始数据或者从键盘读入或者赋值;每次运行的结果未保存下来,下次想看结果必须再次运行程序。
但是,程序中的原始数据、中间结果、最终结果有时需要以数据文件的形式保存下来并在程序中执行相关操作文件操作解决的问题:
通过运行程序,能实现数据文件的读写存储等操作,从而解决程序中的数据永久存储问题文件操作的主要步骤:
定义文件指针打开文件,读写,关闭,2009.8朱立华俞琼王立柱,7,文件指针,每一个文件对应一个文件指针,文件操作必须通过文件指针才能完成。
几个常用的文件指针:
键盘-stdin,显示器-stdout,打印机sprn从键盘(stdin)和显示器(stdout)输入输出数据的操作通常将键盘文件和显示器文件省略了字符、字符串、数值型变量的输入/输出用终端方式以及等效的文件输入输出方式对比如下:
chars10;/字符串gets(s);puts(s);,chars10;/字符串fgets(s,5,stdin);fputs(s,stdout);,intn;/整型scanf(“%d”,intn;/整型fscanf(stdin,“%d”,2009.8朱立华俞琼王立柱,8,文件指针,以下主要讨论磁盘文件,磁盘是一种外部介质,与键盘和显示器不同,它可以持久地保存数据。
专门存放数据的磁盘文件我们称其为数据文件流的数据组织形式分为字符序列和字节序列,前者称为文本流,后者称为二进制流。
例:
double型常量136467.56789,如果是一个文本流,共占12个字节(一个字符对应一个ASCII码,每一个ASCII码占一个字节);如果是二进制流,共占8个字节例:
longint型常量100,如果是一个文本流,共占3个字节;如果是二进制流,共占4个字节与文本流和二进制流对应的磁盘文件分别称为文本文件和二进制文件。
2009.8朱立华俞琼王立柱,9,文件的打开与关闭,并不是每一次读写文件操作都需要进行磁盘访问读写操作的本质:
每一次对磁盘的读写都要移动磁头,以寻找磁道扇区。
若程序中的每一次读写操作都对应一次实际的磁盘访问,则要花费很多读写时间,而且对磁盘的损耗大。
解决方案:
系统在内存中为程序所需要的每一个文件开辟一个“缓冲区”:
当程序从磁盘文件读取数据时,一次将一批数据送到(输入)缓冲区,然后将缓冲区的数据传给程序中的接收变量;如果向磁盘文件输出时,先将程序中的数据送到(输出)缓冲区,待缓冲区装满后,再一次传给磁盘文件。
FILE类型:
读取一个文件需要许多信息,例如,与该文件对应的内存文件缓冲区的大小和地址、文件当前的读写位置、文件缓冲区中未处理的字符个数、文件使用方式等。
这些信息存放在一个结构变量中,我们称此结构为文件类型,取名FILE。
2009.8朱立华俞琼王立柱,10,10,文件的打开与关闭,File类型的定义:
structFILEshortlevel;/文件缓冲区满或空的程度unsignedflags;/文件状态标志charfd;/文件描述符unsignedcharhold;/若无文件缓冲区,则不读取数据shortbsize;/文件缓冲区大小unsignedchar*buffer;/文件缓冲区的位置unsignedchar*curp;/指向文件缓冲区当前数据的指针unsignedistemp;/临时文件指示器shorttoken;/用于有效性检验;,2009.8朱立华俞琼王立柱,11,11,文件的打开与关闭,程序用到一个文件,需要系统在内存建立一个文件缓冲区,并返回一个文件类型变量的地址(FILE类型的指针),这是打开文件打开文件通过调用fopen函数实现,原型为:
FILE*fopen(char*filename,char*mode);因此,程序首先需要定义一个FILE*指针来接收fopen函数的返回值,以后通过该指针对文件进行各种读写操作例:
FILE*fp;fp=fopen(D:
records.txt,r);如果文件打开成功,则返回一个有效地址值;如果打开失败则返回值为NULL(0),filemame表示磁盘文件名,mode代表文件使用方式,返回值为FILE*指针,带盘符路径的完整文件名,以r方式打开表示从文件中读数据入内存,2009.8朱立华俞琼王立柱,12,12,文件的打开与关闭,重点是文件的打开方式,记住下面5个符号:
r(意为read):
打开一个已存在的文件以便从文件中读数据入内存,指针fp-curp定位于文件头;若文件不存在则打开失败返回0w(意为write):
建立一个新文件以便写数据入文件,指针fp-curp定位于文件头;若文件已存在则清空原文件,打开失败返回0a(意为append):
打开一个已存在的文件以便在原文件尾追加新的内容,指针fp-curp定位于文件尾;若文件不存在则相当于w的作用,打开失败返回0+:
作为前三个的后缀使用,表示打开之后既可读又可写b(意为binary):
作为前3个的后缀使用,表示打开的是一个二进制文件,没有此后缀则默认打开的是文本文件,2009.8朱立华俞琼王立柱,13,13,文件的打开与关闭,因此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(cantopenfiles.txtn);exit
(1);,FILE*fp;if(!
(fp=fopen(D:
records.txt,r),2009.8朱立华俞琼王立柱,14,14,文件的打开与关闭,文件打开后执行读写操作完毕,需要释放文件缓冲区,这是关闭文件,所调用的函数原型为:
intfclose(FILE*fp);特别提醒:
在执行写操作之后必须调用函数fclose,系统将在释放输出文件缓冲区之前,将其中最后一批还未充满该缓冲区的数据写入文件。
因此,如果执行文件写操作之后没有关闭文件,可能丢失数据.fclose执行完毕后,文件指针与文件之间不再有关联对标准输入文件(键盘)、标准输出文件(显示器)和标准出错输出文件(显示器),都由系统自动打开和关闭。
成功关闭文件,返回0值,否则返回非0值,2009.8朱立华俞琼王立柱,15,15,文件的读写,根据文件读写操作涉及到的数据的类型和不同方式,分四组介绍:
字符的读写字符串的读写无格式读写格式读写
(1)字符的读写:
处理文本流(文本文件),文本流是字符序列,字符读写函数以字符为单位读写:
intfputc(intc,FILE*fp);intfgetc(FILE*fp);程序11.1从键盘输入一段文本,存储到文本文件D:
poem.txt中(fputc的应用),将字符c写入流,指针fp-curp后移一个字节,。
若成功则返回c,否则返回EOF(-1),fgetc从流中读取一个字符返回,指针fp-curp后移一个字节,读到结尾标志返回EOF,2009.8朱立华俞琼王立柱,16,16,文件的读写字符读写,程序11.1的几点说明:
(1)该程序运行后,屏幕上无任何输出,读入的内容写入到了文件D:
poem.txt中
(2)该文本文件的显示方式有多种:
在VC+下直接用文件中的打开命令可以在客户区中显示回到操作系统的“资源管理器”或“我的电脑”,打开D盘,再用鼠标左键双击打开“poem.txt”,就可以在默认的记事本中显示文件内容进入到“命令提示符”状态键入命令:
typed:
poem.txt,就可以在DOS界面下显示文件内容。
通过程序11.2,打开该文件,读出文件中的内容,在显示器显示。
2009.8朱立华俞琼王立柱,17,17,文件的读写字符读写,程序11.2:
从文件D:
poem.txt读出文本,在显示器上输出。
几个关键性问题:
(1)打开文件时一定要判断是否正确打开,注意要保证相应的路径中一定存在该文件
(2)正确判断一个文件是否结束有两种方式一种是根据当前读到的字符是否为EOF(-1)另一种是用feof(fp)函数判断指针fp-curp是否已指在文件尾,关键语句:
while(ch=fgetc(fp)!
=EOF)putchar(ch);/输出该字符,如果当前读入的字符不是文件结尾标志,动态演示展示的是与此段代码等效的控制方式,注意比较,函数feof的作用是判断文件是否结束,结束返回1,未结束返回0,2009.8朱立华俞琼王立柱,18,18,文件的读写字符串读写,
(2)字符串的读写:
处理文本流(文本文件),文本流是字符序列,字符串读写函数以字符串为单位读写:
intfputs(char*s,FILE*fp);char*fgets(char*s,intn,FILE*fp);关于fgets函数再作几点说明:
若遇回车符或文件结束符之前,已读取了n-1个字符,则读取结束,加上串结束符0组成字符串,存入s指向的内存区若提前遇到换行符,则读取结束,在换行符后加上串结束符0组成字符串,存入s指向的内存区。
若提前遇到文件结束符,则读取结束,将文件结束符换为串结束符0组成字符串存入s指向的内存区。
若读入正常结束,则返回值是字符串指针s,否则返回空指针值NULL。
将字符串s舍去串结束符0之后从fp-curp所指的当前位置写起,错误时返回EOF(-1),否则返回一个非负数。
从fp-curp位置开始最多读取n-1个字符存入串s,串末加0,正常读取返回s的位置,否则返回NULL(0),2009.8朱立华俞琼王立柱,19,19,文件的读写字符串读写,程序11.3:
从文件D:
poem.txt逐行读入文本,在显示器上输出。
几个关键性问题:
(1)打开文件时一定要判断是否正确打开,注意要保证相应的路径中一定存在该文件
(2)正确判断一个文件是否结束有两种方式一种是读入一个字符串,返回值是否非空另一种是用feof(fp)函数判断指针fp-curp是否已指在文件尾.关键语句:
while(fgets(s,256,fp)!
=NULL)printf(“%s”,s);/输出该字符串,动态演示展示的是与此段代码等效的控制方式,注意比较,2009.8朱立华俞琼王立柱,20,20,文件的读写无格式读写,(3)无格式读写也称为按数据块读写,主要用于处理二进制流(二进制文件)。
二进制流是字节序列,将字节序列分段截取,每一段代表一个数据元素intfwrite(constvoid*buffer,intsize,intn,FILE*fp);intfread(void*buffer,intsize,intn,FILE*fp);读写操作之后,指针fp-curp自动后移,准备下一次读写。
程序11.4从键盘输入一批学生记录,存储到文件D:
st.rec中几个关键性问题:
(1)定义结构体类型表示学生记录
(2)打开文件并判断是否正确打开(3)从键盘上逐条记录输入,逐条记录写入文件,从程序数据区地址buffer开始,将连续siz