收藏 分享(赏)

《C语言》课件-8.ppt

上传人:jinchen 文档编号:8117688 上传时间:2019-06-09 格式:PPT 页数:23 大小:533.50KB
下载 相关 举报
《C语言》课件-8.ppt_第1页
第1页 / 共23页
《C语言》课件-8.ppt_第2页
第2页 / 共23页
《C语言》课件-8.ppt_第3页
第3页 / 共23页
《C语言》课件-8.ppt_第4页
第4页 / 共23页
《C语言》课件-8.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、第8章 C的文件操作函数,1.,2.,3.,本章讲述内容:,4.,C语言能够处理的文件形式;,C语言文件的结构类型及其指针 ;,文件的打开和关闭函数 ;,有关文件的读、写函数;,5.,有关文件的操作函数。,8.1 文件及文件型指针,.,8.1.1 C的文件概念,所谓“文件”,是指存储在外部设备上的、以名字作为标识的数据集合。如今大都把文件存储在磁盘上,因此统称其为磁盘文件。,所谓“文本文件”,是把内存中的数据转变成相应的ASCII码值形式,然后存放在磁盘上。因此,磁盘上每个字节存放的内容是ASCII码值,表示一个字符。,所谓“二进制文件”,是把内存中的数据按其在内存中的存储形式原样存放到磁盘上

2、去。,.,.,例:,考察整数2008 在内存中的存放,以文本文件形式在磁盘上的存放,以二进制文件形式在磁盘上的存放。,(1),数值2008在内存的存储形式:,(2),数值2008以文本形式在磁盘的存储形式:,(3),数值2008以二进制形式在磁盘的存储形式:,0 0 0 0 0 1 1 1,1 1 0 1 1 0 0 0,0 0 0 0 0 1 1 1,1 1 0 1 1 0 0 0,0 0 1 1 0 0 1 0,0 0 1 1 0 0 0 0,0 0 1 1 0 0 0 0,0 0 1 1 1 0 0 0,2,0,0,8,.,数据按文本形式存储在磁盘上,占用的存储空间多,存储时要花费转换时

3、间。但以这种形式存储,一个字节代表一个字符,便于对字符进行逐个处理,也便于输出显示。,.,数据按二进制形式存储在磁盘上时,无须花费转换时间,占用空间少。但字节不与字符对应,因此不能直接输出显示。,在使用C的文件操作函数时,正确指定磁盘文件所在路径非常重要。路径不对,系统就找不到文件,也就无法对该文件进行任何处理了。,.,C语言里,把进行输入/输出的终端设备(键盘、显示器)视为文件,统称为“标准设备文件”。最主要有3个:与键盘对应的标准输入文件;与显示屏对应的标准输出文件;与显示屏对应的标准出错信息文件。,.,.,在将输入/输出终端设备与“文件”联系起来后,从键盘上读取数据时,可用C提供的文件操

4、作函数,改为从标准输入文件(即是键盘)里读取;往屏幕上写数据,可用C提供的文件操作函数,改为往标准输出文件(即是显示屏)里写。,.,所谓“缓冲文件系统” ,即是输出时,先将数据送到内存缓冲区,缓冲区装满后,才将整个缓冲区的内容一次写入磁盘;输入时,先把磁盘中的一块数据读入到内存缓冲区,然后再从缓冲区中把需要的数据挑出来,送到程序规定的数据区中。整个处理过程如图所示。,磁盘,输入,输出,输入文件缓冲区,输出文件缓冲区,输出,输入,程序数据区,内存,8.1.2 C的文件结构及其指针,C语言中,把文件视为是具有“FILE”结构类型的数据,系统在“stdio.h”头文件里给出了它的定义。,.,FILE

5、结构类型的形式大致为: typedef struct iobuf int fd; /* 文件描述符 */int mode; /* 文件操作模式 */int cleft; /* 文件缓冲区剩余字节数 */char *nextc; /* 下一个待处理字节地址 */char *buff; /* 文件缓冲区首地址 */ FILE;,.,C语言中的每个文件,都有一个FILE型结构变量与之对应,只要知道其地址,就可通过它里面记录的信息,实现访问这个文件的目的。所以,指向FILE型结构变量的指针(简称“文件指针”)对于文件的使用是极其重要的。,.,.,程序中可通过下面的方法来说明变量fp是一个文件指针:FI

6、LE *fp; 把某个文件的FILE结构变量地址赋给它后,就在这个文件和文件指针fp之间建立起了联系,C语言就把这个指针作为该文件的标识,在程序中就可通过fp来访问这个文件了。,8.2.1 文件打开函数:fopen(),8.2 文件的打开与关闭函数,所谓“打开文件”,即是建立起某个文件与一个FILE变量的联系,使得能够通过这个FILE变量,对该文件进行输入或输出操作。,.,.,所谓“关闭文件”,即是切断文件与所对应FILE变量的联系,从而不能进行输入或输出操作。,文件打开函数fopen()的函数头格式是:,.,FILE *fopen (, ),其中是所要打开的、包含路径在内的一个文件的名字,它

7、是一个字符串常量(即用双引号括起来);是一个字符串常量,指明欲打开文件的性质(是文本文件还是二进制文件),以及被打开后是用于读、写还是又读又写。,如果正确地将所需要的文件打开了,那么表明系统已在指定文件和一个FILE变量之间建立起了联系,并把文件的有关信息赋给了这个FILE变量的成员。返回的FILE型指针,正是那个FILE变量的地址。于是,函数fopen()的调用者必须定义一个FILE型指针,来接收这个地址。,.,这里调用fopen(),想以只读方式(“r”)打开文件“C:/zong/prog/test.txt”。打开后,返回值由FILE型指针变量fp接收。若打开失败,则输出信息:file c

8、an not be opened! 然后调用系统函数exit()终止运行。,例:,程序中有如下的语句:,FILE *fp; if (fp = fopen (“C:/zong/prog/test.txt“, “r“) = NULL) printf (“file can not be opened!n“);exit (1); ,若成功打开,那么fp就是该文件的标识,要在该文件上操作,就都用这个指针来标识文件名。删节号“”处是成功打开文件后的程序语句,在那里只出现指针fp。,.,.,.,可能导致函数fopen()返回NULL的原因 :,(1),(2),所给文件名不对 ;,文件所在磁盘没有准备好(比如

9、软盘未插好等);,(3),(4),在指定的目录下不存在这个文件;,试图以“r”(读)模式打开一个不存在的文件。,编写程序,在用户目录下,用“w”打开模式建立一个名为test.txt的新文件,然后将其关闭。,8.2.2 文件关闭函数:fclose(),文件关闭函数fclose()的函数头格式是:,.,int fclose (),这个指针指向的是用fopen()得到的那个与文件相关联的FILE结构变量。若文件关闭成功,函数将返回值0;若关闭失败,函数返回EOF(系统定义的符号常量,表示1),说明关闭有错。,例:,(1),程序实现,#include “stdio.h“ main() FILE *fp

10、;if (fp=fopen(“C:/zdh/test1.txt“, “w“) = NULL)printf (“can not open file!n“);exit(1); fclose (fp); ,(2),分析与讨论,.,执行该程序后,请查看一下用户自己的目录下,是否多了一个文本文件test1。,C语言3个标准设备文件是:标准输入文件、标准输出文件、标准出错信息文件,系统启动后会自动被打开。它们各自所对应的FILE指针变量名如表所示。,.,8.2.3 标准设备文件的使用,标准设备文件名,对应的FILE型指针名,标准输入文件(键盘),标准输出文件(显示屏幕),标准出错信息文件(显示屏幕),st

11、din,stdout,stderr,.,有了这些FILE型指针名,在程序中调用C文件的各种操作函数时,就可以直接用它们来代表键盘或显示屏幕,以文件的形式来完成所需要的输入、输出任务了。,对于3种标准设备文件,用户既不用关心它的打开,也不用关心它的关闭,在程序中什么时候想用,就尽管拿来用。只有到退出系统时,系统才会自动将它们关闭。,.,8.3 文件的读/写操作,.,8.3.1 文件尾测试函数,在读取文件数据时,必须判断是否已读到了文件尾。文件尾测试函数就用于此目的。,.,文件尾测试函数feof()的函数头格式是:,int feof (),是指向由fopen()得到的与文件相关联的FILE结构变量

12、。如果已经到达文件尾,那么函数返回非0值,否则返回值0。,#include “stdio.h“ main() FILE *fp;if (fp=fopen(“C:/zdh/test1.txt“, “r“) = NULL)printf (“can not open file!n“);exit(1);,while ( !feof (fp) )fclose (fp); ,例:,文件尾测试函数在程序中的使用方法,文件测试函数的使用,8.3.2 读/写字符函数,.,读/写字符函数是指把一个字符写入文件,或从文件中读取一个字符的操作。因此,这是以字节为单位进行的输入/输出。,1.,写字符函数:fputc()

13、,.,写字符函数fputc ()的函数头格式是:,int fputc (, ),其中是一个字符常量,也可是一个有值的字符型变量,它就是要往文件上写的字符;即是接收字符的文件。若输出成功,函数返回输出的字符;否则返回EOF(1)。,例:,编写一个程序,从键盘上输入一个字符串,利用写字符函数fputc(),将其存入到文件“C:/zdh/test1.txt”中。,#include “stdio.h“ main() FILE *fp; int k; char str80;if (fp=fopen (“C:/zdh/test1.txt“, “w“) = NULL)printf (“file can no

14、t be opened!n“);exit (1);,gets (str);for (k=0; strk; k+)fputc (strk, fp);fclose (fp); ,程序里,用以前学的函数gets()接收来自键盘的输入,然后用写字符函数fputc(),把数组str里的字符一个个往文件fp上写。,.,.,2.,读字符函数:fgetc(),读字符函数fgetc ()的函数头格式是:,char fgetc (),其中指出是要从这个文件里读取一个字符。如果操作正确,函数返回读出字符的ASCII码值;如果读到文件结束或出错,则返回EOF(1)。,例:,编写一个程序,把已建立的磁盘文件test1中

15、的内容读出,并显示在屏幕上。,#include “stdio.h“ main() FILE *fp;int k;char ch;if (fp=fopen (“c:/zdh/test1.txt“, “r“) = NULL) printf (“file can not be opened!n“);exit (1);,ch = fgetc (fp);while (!feof (fp) ) putchar (ch);ch = fgetc (fp); fclose (fp); ,.,程序中以“r”模式打开文件test1。如果打开成功,则文件指针fp就代表该文件。,.,用函数fgetc()先从文件fp中读

16、取一个字符,并进入while循环。只要没有到达文件结束处,读取操作就继续。,例:,编写程序,从键盘上输入一个字符串,将其存入到文件stdout中。,#include “stdio.h“ main() int k; char str80;gets (str);for (k=0; strk; k+)fputc (strk, stdout); ,.,文件stdout即是显示屏,所以题目的意思是从键盘上输入字符串后,在显示屏幕上显示。程序中用两种方法显示字符串,一是执行语句:gets (str); 二是通过for循环,将str里的内容存入stdout。,编写程序,从文件stdin上读取任意一个字符串,

17、然后存入文件stdout中。,例:,#include “stdio.h“ main() int k=0; char str80;strk = fgetc(stdin);while (!feof (stdin) )str+k = fgetc(stdin);strk = 0;for (k=0; strk; k+)fputc (strk, stdout);,.,文件stdin就是键盘,stdout就是显示屏。因此程序的要求是从键盘输入字符串,然后在屏幕上显示。,.,对于键盘文件,程序中的while循环条件:!feof (stdin) 表示是否从键盘上输入了一个文件结束符。若输入的不是文件结束符,循环

18、继续;否则停止。,.,对于PC机,文件结束符由:+ z 形成,即在按键盘上的“Ctrl”键的同时,按字母键“z”,最后按“Enter”键。,8.3.3 读/写字符串函数,.,读/写字符串函数即是把一行字符写入文件,或从文件中读取一行字符的操作。因此,这是以字符串为单位进行的文件输入/输出。,1.,写字符串函数:fputs(),.,写字符串函数fputs ()的函数头格式是:,int fputs (, ),其中是字符串常量、字符数组名,也可是指向待输出字符串的字符型指针;则是已打开的、接收输出的文件。函数执行后,返回写入文件的实际字符数,文件内部指针自动后移到新的位置;若执行错误,则返回EOF。

19、,从键盘读取一个字符串,暂时存放在一维数组中。然后利用fputs()函数,把它存入文件“C:/zdh/test2.txt”。,例:,#include “stdio.h“ main() FILE *fp; int k; char str40;gets (str);if (fp=fopen(“C:/zdh/test2.txt“, “w“) = NULL) printf (“file can not be opened!n “);exit (1);,fputs (str, fp);fclose (fp); ,.,程序里,用gets()直接从键盘输入字符串到数组str。然后以“w”模式打开文件“C:/

20、zdh/test2.txt”,利用fputs(),把暂存在数组str里的字符串写入文件fp中。,.,.,在使用数组的地方,也可以使用字符型指针 。这时的程序为:,#include “stdio.h“ main() FILE *fp;int k;char *str;gets (str);if (fp=fopen(“c:/zdh/test2.txt“, “w“) = NULL) printf (“file can not be opened!n “);exit (1);,fputs (str, fp);fclose (fp); ,这里是一个字符型指针,而不是数组,2.,读字符串函数:fgets()

21、,读字符串函数fgets ()的函数头格式是:,char *fgets (, , ),是指向存放字符串存储区的指针,也可是一个字符数组名(要把读出的字符串存放在它里面);规定要读出的字符数;是已打开的那个可读文件指针。,.,注意:若为n,那么C语言总是从文件当前位置开始读最多n1个字符,在其后添加字符串结束符“0”后,存入指定的存储区。,从键盘读取字符串,暂时存放在一维数组中。然后利用fputs()把它存入文件“C:/zdh/test2.txt”。重新打开该文件,将存放其中的字符串读入另一个一维数组,并将它输出。,例:,#include “stdio.h“ main() FILE *fp;in

22、t k;char str140, str240;gets (str1);if (fp=fopen(“C:/zdh/test2.txt“, “w“) = NULL) printf (“file can not open!n “);exit (1);fputs (str1, fp);fclose (fp);if (fp=fopen(“C:/zdh/test2.txt“, “r“) = NULL) printf (“file can not open!n “);exit (1);,fgets (str2, 40, fp);fclose (fp);fputs (str2, stdout); ,.,第1

23、部分,第2部分,第3部分,第4部分,整个程序可划分成4个部分,各部分包括的语句如程序中的标注所示,功能是清楚的。,.,该例是前例基础上的扩展,因此前半部分的程序是完全相同的。,(1),程序实现,(2),分析与讨论,8.3.4 读/写数据函数,.,读/写数据函数是把指定长的若干数据写入文件,或从文件中读取指定长的若干数据的操作。因此,这是以数据为单位进行的文件输入/输出。,1.,写数据函数:fwrite(),.,写数据函数fwrite ()的函数头格式是:,int fwrite (, , , ),指向输出数据存放的内存存储区;规定一个数据所含的字节数;指明要输出的数据个数。是输出的目的地。该函数

24、执行正确时,返回所写数据的个数;否则返回NULL。,例:,有如下语句:,文件fp,fwrite(),写入,一个数据,一个数据,一个数据,内存,buf,18个数据,20个字节,fwrite (buf, 20, 18, fp);,它表示要把数据写入由fp指向的文件,数据现在存放在由指针buf指向的内存区域里。写入的数据共18个,每个为20字节长。,该函数的作用如图所示。,.,2.,读数据函数:fread(),.,读数据函数fread ()的函数头格式是:,int fread (, , , ),编写程序,它往一个结构数组中输入3个数据,并将这3个数据写入文 件。打开该文件, 将里面的数据读到另一个结

25、构 数组,然后打印显示。验证函 数fwrite()、fread()的工作。,例:,#include “stdio.h“ struct goods char item10;int code; int stock; ;,main() struct goods fruit3, temp3, *p;int k; FILE *fp;for (k=0, p=fruit; kitem, ,fwrite (fruit, sizeof(struct goods), 3, fp); fclose (fp);if (fp=fopen(“C:/zdh/test3.dat“, “r“) = NULL) printf (

26、“file can not be opened!n “); exit (1);fread (temp, sizeof(struct goods), 3, fp); fclose (fp);for (k=0, p=temp; kitem, p-code, p-stock); ,.,程序中定义了名为struct goods的结构类型。在main()中,fruit和temp是这种结构类型的数组,p是这种结构类型的指针。,.,注意,程序里是通过“sizeof(struct goods)”来求出结构struct goods的长度的。,.,程序中,也可以以“wb”和“rb”的模式打开文件,结果是一样的。,

27、编写程序,把输入数据存放在数组中。然后利用fprintf(),将数组元素写入文件“C:/zdh/test4.dat”和标准输出文件stdout。,8.3.5 格式读/写函数,.,格式读/写函数,即是把指定格式的数据写入文件,或从文件中读取指定格式的数据的操作。因此,是按数据格式要求进行的文件输入/输出。,1.,格式写函数:fprintf(),.,格式写函数fprintf ()的函数头格式是:,int fprintf (, , ),和的含义,与函数printf ()一样。是打开的文件,中的变量值,将以里给出的格式说明(以%开头)写入该文件。函数正确执行后,返回写入文件的数值个数;否则返回EOF。

28、,例:,#include “stdio.h“ main() FILE *fp; float st5; int k;printf (“Please enter 5 float numbers: “);for (k=0; k5; k+) scanf (“%f“, (st+k);if (fp=fopen(“C:/zdh/test4.dat“, “w“) = NULL) printf (“file %s can not be opened!n“); exit (1);,for (k=0; k5; k+) fprintf (fp, “%5.2fn“, k, stk);fprintf (stdout, “

29、st%d=%5.2fn“, k, stk );fclose (fp); printf (“n“); ,2.,格式读函数:fscanf(),.,格式读函数fscanf ()的函数头格式是:,int fscanf (, , ),和的含义与scanf ()一样。是打开的文件,是把这个文件里的数据,按的格式说明(以“%”开头),读到所列变量地址中去。正确执行后返回读出的数值个数;否则返回EOF。,编写程序,把输入数据存放在数组中。根据用户输入的文件名,打开该文件,并利用函数fprintf(),将数组元素写入该文件中。,例:,#include “stdio.h“ main() FILE *fp;floa

30、t st5;int k;char fname30;printf (“Please enter file name:“);scanf (“%s“, fname);printf (“Please enter 5 float numbers: “);for (k=0; k5; k+)scanf (“%f“, (st+k);,if (fp=fopen( fname, “w“) = NULL) printf (“file %s can not be opened!n“);exit (1);for (k=0; k5; k+) fprintf (fp, “%5.2fn“, k, stk);fprintf (

31、stdout, “st%d=%5.2fn“, k, stk );fclose (fp);printf (“n“); ,8.4 文件操作中的其他函数,8.4.1 文件头定位函数,.,文件头定位函数rewind()可以使文件内部指针重新指向文件头。其函数头格式是:,void rewind (),是通过函数fopen()打开的一个文件,是要把它的文件内部指针移到文件的开头。,编写程序,检验rewind()的功能。,例:,#include “stdio.h“ #define N 13 main() FILE *fp;char str=“ABCDEFGHIJKLMNOPQRSTUVWXYZ“;char

32、tempN;if (fp=fopen(“c:/zdh/test5.txt“, “w“)=NULL) printf (“file can not be opened!n“); exit (1);,fputs (str, fp);fclose (fp);if (fp=fopen(“c:/zdh/test5.txt“, “r“)=NULL) printf (“file can not be opened!n“); exit (1);fgets (temp, N, fp); printf (“(1): %sn“, temp);fgets (temp, N, fp); printf (“(2): %sn

33、“, temp);rewind(fp); fgets (temp, N, fp);printf (“(3): %sn“, temp); fclose (fp); ,.,数组str中放置的是实验字符串,共26个大写英文字母。,比如:fseek (fp, 1500L, SEEK_SET); /* 等价于fseek (fp, 1500L, 0); */ 表示将文件fp的内部指针移到距文件头1500个字节的地方。比如:fseek (fp, 50L, SEEK_CUR); /* 等价于fseek (fp, 50L, 1); */ 表示从当前位置开始向文件fp的尾部方向移动50个字节。又比如:fseek

34、(fp, 100L, SEEK_END); /* 等价于fseek (fp, 100L, 2); */ 表示从文件fp的尾部开始朝头部移动100个字节。,8.4.2 文件随机定位函数,若希望读文件中的某个数据,又不想把它前面的数据读出来,那就要用到文件的随机定位函数fseek()。其函数头格式是:,.,int fseek (, , ),指明已被打开的要定位文件;指明定位的起始基点;指明从基点开始计算的字节数。,C语言规定,可以取表中所列3个符号常数或整数值中的一个。,.,符号常数,相应整数值,含义,SEEK-SET,SEEK-CUR,SEEK-END,0,1,2,从文件头开始,从文件内部指针当

35、前位置开始,从文件尾开始,例:,8.4.3 错误测试函数,.,可以使用函数ferror()来判定文件操作是否出错。其函数头是:,int ferror (),参数指明被测试的文件,用来对该文件所做最近的一次操作进行正确性测试。如果操作出错,返回非0,否则返回0。,编写程序,接收从键盘输入的一个字符串、一个实数、一个整数,随之将其存入文件。,例:,#include “stdio.h“ void errp (FILE *fp) if (ferror (fp) != 0)printf (“file operates be defeated.n“);exit (1);elsereturn; ,main() FILE *fp; char st10;float x; int k;fp=fopen(“c:/zdh/test6.dat“, “w“);errp (fp);printf (“Please enter a string,a float, an integer: “);fscanf (stdin, “%s%f%d“, st, ,感,谢,使,用,本,片,!,二零零八年十一月于北京,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报