c语言教程第9章.ppt

上传人:小飞机 文档编号:6503877 上传时间:2023-11-07 格式:PPT 页数:44 大小:229.99KB
返回 下载 相关 举报
c语言教程第9章.ppt_第1页
第1页 / 共44页
c语言教程第9章.ppt_第2页
第2页 / 共44页
c语言教程第9章.ppt_第3页
第3页 / 共44页
c语言教程第9章.ppt_第4页
第4页 / 共44页
c语言教程第9章.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《c语言教程第9章.ppt》由会员分享,可在线阅读,更多相关《c语言教程第9章.ppt(44页珍藏版)》请在三一办公上搜索。

1、第十三讲 文件,C文件概述文件类型指针文件的打开与关闭文件的读写文件的定位出错的检测非缓冲文件系统文件输入输出小结,C文件概述,文件(file)一般指:存储在外部介质上数据的集合。数据是以文件的形式存放在外部介质(如磁盘)上的,操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成.根据数据的组织形成,可分为ASCII文件和二进制文件。ASCII文件又称文

2、本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符.二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。,ASCII形式和二进制形式输出的不同:例:如果有一个整数10000,在内存中占2个字节,如果按 ASCII形式输出,则占5个字节,而按二进制形式输出,在磁盘上只占2个字节.如下图所示:,00100111 00010000,00100111 00010000,00110001 00110000 00110000 00110000 00110000,ASCII形式,(1)(0)(0)(0)(0),二进制形式,由前所述,一个C文件是一个字节流或二进制流。它把数

3、据看作是一连串的字符(字节),而不考虑记录的界限,即C中文件并不是由记录(record)组成的。在C中对文件的存取是以字符(字节)为单位的,输入/输出数据流的开始和结束仅受程序控制而不受物理符号控制,我们把这种文件称为流式文件。,流式文件的形式:,文件的处理方法,旧C版本有两种对文件的处理方法:一.缓冲文件系统:,数据程序区,输出文件缓冲区,输入文件缓冲区,输出,输入,输出,输入,磁盘,所谓缓冲文件系统是指,系统自动地在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去;从磁盘向内存读入数据,也是一次从磁盘文件将一批数据输入

4、到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。缓冲区的大小由各个具体的C版本确定,一般为512字节。,二.非缓冲文件系统:所谓“非缓冲文件系统”是指系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。在UNIX系统中,用缓冲文件系统来处理文本文件,用非缓冲文件系统处理二进制文件。用缓冲文件系统进行的输入/输出又称为高级输入/输出系统,用非缓冲文件系统进行的输入输出又称为低级输入/输出系统。T只采用缓冲文件系统,即既用缓冲文件系统处理文本文件,也用它来处理二进制文件。,文件类型指针,缓冲文件系统中,关键的概念是“文件指针”。每个被使用的文件都在内存中开辟一个区域

5、,用来存放文件的有关信息(如文件的名字,文件状态及文件当前位置等)。这些信息是保存在一个结构体类型变量中的,该结构体类型由系统定义,取名为FILE。一般的C中,在stdio.h文件中有以下的类型定义:typedef struct int _fd;/*文件号*/int _cleft;/*缓冲区中剩下的字符*/int _mode;/*文件操作模式*/char*_nextc;/*下一个字符位置*/char*_buff;/*文件缓冲区位置*/FILE;,有了FILE类型之后,可以用它来定义若干FILE类型的变量,以便存放若干个文件的信息。例如,可以定义文件型指针变量,如FILE*fp;fp是一个指向F

6、ILE类型结构体的指针变量,可以使fp指向一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件,也就是说,通过文件指针变量能够找到与它相关的文件。如果有n个文件,一般应设n个指针(指向FILE类型结构体的指针变量),使它们分别指向n个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。,文件的打开(fopen函数),与其它高级语言一样,对文件读写之前应该“打开”该文件,在使用结束之后应关闭该文件。fopen函数的调用方式为:FILE*fp;fp=fopen(文件名,使用文件方式);例如:fp=fopen(“A1”,”r”)它表示:要打开名字为A1的文件,使用文件方式为

7、“读入”,fopen函数带回指向A1文件的指针并赋给fp,这样fp就和A1相联系了,或者说,fp指向A1文件。,可以看出,在打开一个文件时,通知给编译系统以下三个信息:(1)需要打开的文件名,也就是准备访问的文件的 名字。(2)使用文件的方式(读还是写等)。(3)让哪一个指针变量指向被打开的文件。,文件使用方式 含义“r”(只读)为输入打开一个文本文件“w”(只写)为输出打开一个文本文件“a”(追加)向文本文件尾增加数据“rb”(只读)为输入打开一个二进制文件“wb”(只写)为输出打开一个二进制文件“ab”(追加)向二进制文件尾增加数据“r+”(读写)为读/写打开一个文本文件“w+”(读写)为

8、读/写建立一个新的文本文件“a+”(读写)为读/写打开一个文本文件“rb+”(读写)为读/写打开一个二进制文件“wb+”(读写)为读/写建立一个新的二进制文件“ab+”(读写)为读/写打开一个二进制文件,使用文件方式如下表:,说明,1.用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据。而且该文件应该已经存在,否则出错。2.用“w”方式打开的方式只能用于向该文件写数据,而不能用来向计算机输入。如果原来不存在该文件,则在打开时新建立一个以指定名字命名的文件;如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个新文件。3.如果希望向文件末尾添加新的数据

9、(不希望删除原有数据),则应该用“a”方式打开。若该文件不存在,则先建立该文件。4.用“r+”,”w+”,”a+”方式打开的文件可以用来输入和输出数据。,5.如果不能实现“打开”的任务,fopen函数将会带回一个出错信息,出错的原因可能是:用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等.此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0)。常用下面的方法打开一个文件:if(fp=fopen(“file1”,“r”)=NULL)printf(“cannot open this filen”);exit(0);即先检查打开有否出错,如

10、果有错就在终端上输出“cannot open this file”,exit函数的作用是关闭所有文件,终止正调用的过程。待程序员检查出错误,修改后再运行。,6.在读写文本文件时,将回车和换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。二进制文件则不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一至,一一对应.7.在程序开始运行时,系统自动打开三个标准文件:标准输入,标准输出,标准出错输出。通常这三个文件都与终端相联系.系统自动定义了三个文件指针stdin,stdout和 stderr,分别指向终端输入,终端输出和标准出错输出(也从终端输出)。如果程序中指定

11、要从要stdin所指的文件输入数据,就是指从终端键盘输入数据.,文件的关闭(fclose函数),“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读写操作,除非再次打开,使指针变量重新指向该文件。fclose函数调用的一般形式为:fclose(文件指针);例如:fclose(fp);用fopen函数打开文件时所带回的指针赋给了fp,今把该文件关闭。应该养成在程序终止之前关闭所有使用的文件的习惯,如果不关闭文件将会丢失数据。fclose 函数也带回一个值:当顺利地执行了关闭操作,则返回值为0;如果返值为非零值,则表示关闭时有错误.可以

12、用ferror函数来测试。,fputc函数和fgetc函数,也称putc函数和getc函数.一、fputc函数把一个字符写到磁盘文件上去,其一般形式为fputc(ch,fp);其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量,它从fopen函数得到返回值。fputc函数也带回一个值:如果输出成功则返回值就是输出的字符:如果输出失败,则返回一个EOF。EOF是在stdio.h文件中定义的符号常量,值为-1。,二、fgetc函数 从指定文件读入一个字符,该文件必须是以读或读写方式打开的.fgetc函数的调用形式为ch=fgetc(fp);fp为文件型指针变量,

13、ch 为字符变量,fgetc函数带回一个字符,赋给ch.如果在执行fgetc读字符时遇到文件结束符,函数返回一个文件结束标志EOF。如果想从一个磁盘文件顺序读入所有字符并在屏幕上显示出来,可以:ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);,TC提供一个feof函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为1(真),否则为0(假).如果想顺序读入一个二进制文件中的数据,可以用:while(!feof(fp)c=fgetc(fp);.注意:这种方法也适用于文本文件。,例L9-1:从键盘输入一些字符,逐个把它们送到磁

14、盘上去,直到输入一个“#”为止。例L9-2:文件复制。本程序是按文本文件方式处理的,也可以用此程序来复制一个二进制文件,只需将两个fopen函数中的“r”和“w”分别改为“rb”和”wb”即可。例L9-2-2:用命令行参数进行文件复制。(可在DOS命令行状态下运行,相当于copy命令。),fread函数和fwrite函数,用getc和putc函数可以用来读写文件中的一个字符。但是常常要求一次读入一组数据(例如,一个实数或一个结构体变量的值),ANSI C 标准提出设置两个函数(fread和fwrite),用来读写一个数据块.它们的一般调用形式为:fread(buffer,size,count,

15、fp);fwrite(buffer,size,count,fp);其中:buffer:是一个指针.对fread来说,它是读入数据的存放地址.对fwrite来说,是要输出数据的地址(以上指的是起 始地址)size:要读写的字节数.count:要进行读写多少个size字节的数据项.fp:文件型指针.,如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息,如:fread(f,4,2,fp);其中f是一个实型数组名.一个实型变量占4个字节.这个函数从fp所指向的文件读入2次(每次4个字节)数据,存储到数组f中.如果有一个如下的结构体类型:struct student-typ

16、e char name10;int num;int age;char addr30;stud40;/*每一个元素用一存放一个学生的数据*/,假设学生的数据已存放在磁盘文件中,可以用下面的for语句和fread函数读入40个学生的数据:for(i=0;i40;i+)fread(如果fread或fwrite调用成功,则函数返回值为count的值,即输入或输出数据项的完整个数。注意:fread和fwrite函数一般用于二进制文件的输入输出.因为它们是按数据块的长度来处理输入输出的,在字符发生转换的情况下很可能出现与原设想的情况不同.,例题分析,例L9-3:从键盘输入n个学生的有关数据,然后把它们转存

17、到磁盘文件上去。例L9-3-2:从文件中读所有学生的有关数据,显示在屏幕上。例L9-3-3:向文件中中追加学生数据。例L9-4统计文件中单词的个数。,fgets函数和fputs函数fgets的作用是从指定文件读入一个字符串,如fgets(str,n,fp);从fp 指向的文件输入n-1个字符,并把它们放到字符数组str中,如果在读入n-1 个字符结束之前遇到换行符或EOF,读入即结束,字符串读入后在最后加一个 0字符,fgets函数返回值为str的首地址。fputs函数的作用是向指定的文件输出一个字符串,如fputs(“China”,fp);把字符中“China”输出到fp指向的文件(0不输出

18、)。fputs函数中第一个参 数可以是字符串常量,字符数组名或字符型指针,输出成功,函数值为0;失败时,为非零值。例L9-5:从键盘输入若干行字符串到文件。例L9-6:显示文件内容。例L9-7:改进L9-6 为Type命令。,fprintf函数和fscanf函数,fprintf函数,fscanf函数与printf函数,scanf函数作用相仿,都是格式化读写函数.只有一点不同:fprintf和fscanf函数的读写对象不是终端而是磁盘文件.一般调用方式为:fprintf(文件指针,格式字符串,输出表列)fscanf(文件指针,格式字符串,输入表列)例如:printf(fp,”%d,%6.2f”,

19、i,t);它的作用是将整型变量I和实型变量 t的值按%d和%6.2f的格式输出到 fp指向的文件上.如果I=3,t=4.5,则输出到磁盘文件上的是以下的字符串:3,4,50,同样,用以下fscanf函数可以从磁盘文件上读入ASCII字符:fscanf(fp,”%d,%f”,磁盘文件上如果有以下字符:3,4,5则将磁盘文件中的数据3送给变量I,4,5送给变量t.用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多,因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf 和f

20、scanf函数,而用fread和fwrite函数.,文件的定位,文件中有一个位置指针,指和当前读写的位置。如果顺序读写一个文件,每次读写完一个字符后,该位置指针自动移动指向下一个字符位置,如果想改变这样的规律,可以用有关函数,强制使位置指针指向其它指定的位置。,rewind函数,rewind函数的作用是使位置指针重新返回文件的开头,此函数没有返回值.例L9-9-2:有一个磁盘文件,第一次使它显示在屏幕上,第二次把它复制到另一个文件中。(9-9-3没有末尾符号)#include“stdio.h”main()FILE*fp1,*fp2;fp1=fopen(“file1.c”,”r”);fp2=fo

21、pen(“file2.c”,”w”);while(!feof(fp1)putchar(getc(fp1);rewind(fp1);while(!feof(p1)putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);,fseek函数和随机读写,对流式文件可以进行顺序读写,也可以进行随机读定.关键在于控制文件的位置指针,如果位置指针是按字节位置顺序移动的,就是顺序读写.如果可以将位置指针按需要移动到任意位置,就可以实现随机读写.所谓随机读写,是指读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意所需的字符(字节).用fseek函数

22、可以实现改变文件的位置指针.fseek 函数的调用形式为fseek(文件类型指针,位移量,起始点),“起始点”用0,1或2代替,0代表“文件开始”,1为“当前位置”,2为“文件末尾”。TC指定以下的名字:起始点名字用数字代表文件开始SEEK_SET0文件当前位置 SEEK_CUR1文件末尾SEEK_END2“位移量”指以“起始点”为基点,向前移动的字节数,一般要求位移量是 long 型数据。这样当文件的长度大开64K进不致出问题。Fseek函数一般用于二进制文,因为文本文要发生字符转换,计算位置时往往会发生混乱。调用 fseek如下:fseek(fp,100L,0);将位置指针到离文件头100

23、个字节处fseek(fp,50L,1);将位置指针移到当前位置50个字节处fseek(fp,-10L,2);将位置指针从文件末尾处后退10个字节,ftell函数,fetll函数的作用是得到流式文件中的当前位置,用相对而于文件开头的位置量来表示。由于文件中的位置指针经常移动,人们不容易辨清其当前位置,用ftell函数可以得到当前位置.如果ftell 函数返回值为-1,表示出错。例如:i=ftell(fp);if(i=-1)printf(“errorn”);变量i存放当前位置,如调用函数出错(如不存在此文件),则输出“error”.,ferror函数,在调用各种输入输出函数(如putc,getc,

24、fread,fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror 函数检查。它的一般调用形式为:ferror(fp);如果ferror返回值为0(假),表示未出错.如果返回一个非零值,表示出错。应该注意,对周一个文件每一次调用输入输出函数,均产生一个新的ferror 函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置于0。例L9-9-4,chearerr函数,它的作用是使文件错误标志和文件结束标志置为0.假如在调用一个输入输出函数时出现错误,ferror函数值为一个非零值.在

25、调用clearerr(fp)后,ferror(fp)的值变成0.只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何它一个输入输出函数,或任何其它一个输入函数。,非缓冲文件系统,缓冲输入输出系统又称高级磁盘输入输出系统.非缓冲输入输出系统又称为低级磁盘输入输出系统,系统不为这类文件自动提供文件缓冲区,程序设计必须自己设定一个缓冲区并考虑如何使用它们.非缓冲文件系统提供了一些输入输出函数,用于对这进行输入输出操作.缓冲文件系统(高级I/O系统)是有文件指针的,通过文件指针访问文件,而非缓冲文件系统(低级磁盘I/O系统)则没有文件型指针,不是靠文件指来访问

26、文件,而是一个整数代表一个文件(相当于FORTRAN等语言的“文件号”),这个整数称为“文件说明符.”通过下面介绍的几个常用函数可以对这种方式有一大概的了解.,open 函数,用来打开一个非缓冲文件.它的一般形式为open(文件名,打开方式)打开方式指该文件打开后的工作方式,即读写方式.方式作用 0 只能读 1 只能写 2 可以读/写 例如,open(“Li_1”,0),打开一个名为“Li_1”的文件,只能用于输入.,如果打开成功,open函数返回一个正整数;如果文件夹因故未能打开,则返回-1.open函数一般是这样使用的(设fd已定义为整形变量):if(fd=open(“A”,1)=-1)p

27、rintf(“cannot open file/n”);exit(0);如果要打开的文件不存在,多数编译按“打开失败”处理,不产生新的文件但有的编译可以用open 函数建立一个新文件.例如,上面的打开操作中,如果原来磁盘上不存在一个名为“A”的文件,则open函数建立一个为“A”的文件,可供写数据.另一些C编译系统则只能用creat 函数建立 一个新文件.,close 函数,用来关闭已打开的文件,其调用形式为close(fd);fd 为整型变量,它是“文件说明符”(即文件号).在打开文件时,open函数返回一个整数,这就是“文件说明符”(文件号)在未关闭此文件之前,此文件说明符与该文件相联系,

28、或者说,它代表一个确定的文件执行close 函数后,文件号释放,它不再与一个确定 的文件相联系它可以再被用来与另一文件相联系文件号是由系统在打开时分配的,而不是由程序设计设计者指定的每一个编译系统规定了可以打开的文件的最大数字 由于一个编译系统允许同时打开的数目是有限的因此,凡不再使用的文件应及时用close 函数关闭 如果关闭操作失败(如不存在此文件,可把磁盘从驱动取出),则close 函数返回;成功时返回零,creat函数,有的C编译系统(例如Turbo C)不允许用open函数建立一个新文件,它提供creat函数用来建立新文件.其调用形式为creat(文件名,打开方式);它返回一个整数文

29、件号.例如:fd=creat(“A”,1);,read函数,read 函数的作用是从指定的磁盘文件中读入若干个字符到程序开辟的缓冲区中read(fd,buf,count);其中fd 为文件号,buf 是一个地址,它指向程序员指定的“缓冲区”可以是一人数组或一个变量,或一个已分配内存的数据结构.count是一个整数.上述read函数的作用是从fd所代表的文件中文件中,读count个字节的信息到buf指向的缓冲的缓冲区中,如果执行read成功,则函数返回实际读入的字节数;若遇文件结束则函数值返回0;若有错,返回1.,write 函数,作用是从指定的内存区将若干个字节的信息输出到指定的文件中。其一般

30、形式为write(fd,buf,count);其中 fd,buf,和count 的含义与read函数中相同。上述 write 函数的作用是:从buf 所指向的内存中区中输出count 个字节的信息到fd所代表的磁盘文件中去。Write函数的返回值为实际输出的字节数。如果实际输出的字节数比的指定的count 小,则函数值可能比count 小。如果执行write有错误,则返回值为。,lseek函数和随机读写,用来移动文件位置指针.其调用形式为lseek(文件号,位移量,起始点)其概念大致与缓冲文件系统的fseek函数相同,只是不用文件指针而用文件号来标识文件.“起始点”用0,1和2分别代表“文件开

31、始位置”,文件“当前位置”和“文件末尾”.函数的返回值是长整型(long型).例如:lseek(fd,100L,0);将文件位置指针移到离文件开头100字节处lseek(fd,-10L,1)将文件位置指针从当前位置倒退10个字节如果执行lseek函数失败,则返回-1L(注意-1L代表长整数-1)有了lseek函数就能够实现对非缓冲文件的随机存取,只需事先将文件位置指针移到所需读写的位置上,然后进行读写操作即可.,常用的缓冲文件系统函数,分类函数名功能打开文件fopen()打开文件关闭文件fclose()关闭文件文件定位fseek()改变文件位置指针位置fewind()使文件位置指针重新置于文件

32、开头ftell()返回文件位置指针的当前值文件读写fgetc(),getc()从指定文件取得一个字符gputc(),putc()把字符输出到指定文件fgets()从指定文件读取字符串fputs()把字符串输出到指定文件,分类函数名功能getw()从指定文件读取一个字(int型)putw()把一个字(int型)输出到指定文件fread()从指定文件中读取数据项fwrite()把数据项写到指定文件fscanf()从指定文件按格式输入数据fprintf()按指定格式将数据写到指定文件中文件状态feof()若到文件末尾,函数值为“真”(非0)ferror()若对文件操作作出错,函数值为”真”(非0)clearerr()使ferror和feof函数值置零,续:文件读写,常用的非缓冲文件文件函数,分类函数名功能建立文件creat()建立一个原来不存在的文件打开文件open()打开已有文件关闭文件close()关闭已打开的文件文件定位lseek()移动文件位置指针到指定位置文件读写read()从指定文件读入数据,存入指定区域write()把指定区域中的数据写到指定文件中,例student2 综合:成绩管理,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号