C语言课件第10章.ppt

上传人:sccc 文档编号:5384462 上传时间:2023-07-02 格式:PPT 页数:38 大小:324.01KB
返回 下载 相关 举报
C语言课件第10章.ppt_第1页
第1页 / 共38页
C语言课件第10章.ppt_第2页
第2页 / 共38页
C语言课件第10章.ppt_第3页
第3页 / 共38页
C语言课件第10章.ppt_第4页
第4页 / 共38页
C语言课件第10章.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《C语言课件第10章.ppt》由会员分享,可在线阅读,更多相关《C语言课件第10章.ppt(38页珍藏版)》请在三一办公上搜索。

1、文 件,10.1 C文件的有关概念10.2 文件的打开与关闭10.3 文件的顺序读写10.4 文件的随机读写10.5 文件读写出错的检测本章小结,第10章,C文件的有关概念,10.1,文件是指存储在外存储器上的数据的集合。,教学进程,10.1.1 什么是文件,操作系统是以文件为单位对数据进行管理的。输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即输入输出流。语言把文件看作是一个字符(字节)的序列,即文件是由一个一个字符(字节)的数据顺序组成。一个输入输出流就是一个字节流或二进制流。,C文件的有关概念,10.1,每个文件都有一个标识,称为

2、文件名。操作系统就是根据文件名对各种文件进行存取,并进行处理。文件标识包括三部分:(1)文件路径:(2)主文件名;(3)文件后缀。文件路径表示文件在外部存储设备中的位置。如:d:cc temp file1.dat 文件路径 主文件名 文件后缀,教学进程,10.1.2 文件名,文件的有关概念,主文件名遵循标识符的命名规则。后缀用来表示文件的性质,一般不超过3个字母。如:.doc(Word 文件),.txt(文本文件),.dat(数据文件)。,教学进程,10.1.3 文件的分类,文件的有关概念,根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。,例:整数10000在内存中的存储形式以及

3、分别按ASCII码形式和二进制形式输出如下图所示:,文件的有关概念,教学进程,10.1.4 文件缓冲区,ANSI C标准采用“缓冲文件系统”处理文件,是指系统自动地为正在被使用的文件在内存中开辟一个缓冲区。当需要向外存储器中的文件输出数据时,必须先将数据送到为该文件开辟的缓冲区中,当缓冲区满以后才一起送到外存储器中。当需要从外存储器中的文件读入数据进行处理时,也首先一次从外存储器将一批数据读入缓冲区(将缓冲区充满),然后再从缓冲区中将数据逐个读出进行处理。由此可以看出,在缓冲文件系统中,对文件的输入输出是通过为该文件开辟的缓冲区进行的,对文件中数据的处理也是在该缓冲区中进行的。,10.1.5

4、文件指针,在C语言的缓冲文件系统中,用文件类型指针来标识文件。,教学进程,定义文件类型指针的一般形式为 FILE*指针变量名;其中指针变量名用于指向一个文件,实际上是用于存放文件缓冲区的首地址。,在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息(文件名、文件状态、文件当前位置等)。如果有个文件,一般应设个指针变量,使它们分别指向个文件,以实现对文件的访问。如可以定义FILE类型的数组:FILEf5;即定义了一个有5个元素的结构体数组f,可用来存放5个文件的信息.,文件的有关概念,10.1.6 文件的位置指针,位置指针用来指示当前的读写位置。,教学进程,一

5、般情况下,在对字符文件进行顺序读写时,文件的位置指针指向文件开头,这时如果对文件进行读的操作,就读第一个字符,然后文件的位置指针顺序向后移一个位置,在下一次执行读的操作时,就将指针指向的第二个字符读入。依此类推,直到遇文件尾。,文件的有关概念,文件头 读写当前位置 文件尾,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,然后再接着写入新的数据,这就是文件的追加。C语言允许根据读写的需要,人为地向前、向后、往文件头或文件尾移动文件指针的位置,然后进行读写,这不是顺序读写而是随机读写。,教学进程,一般来说,对文件有以下三个方面的操作:1)打开文件 在计算机内存中开辟一

6、个缓冲区,用于存放被打开文件 的有关信息。2)文件处理 包括在缓冲区中读写数据以及定位等操作。3)关闭文件 将缓冲区中的内容写回到外存(磁盘),并释放缓冲区。,文件的有关概念,文件的打开与关闭,10.2,文件的打开,教学进程,10.2.1 文件的打开,FILE*fp(或其他指针变量名);fp=fopen(文件名,文件使用方式);,fopen()函数,文件名,文件使用方式,要打开的文件的名字,以何种方式打开文件:是读还是写,均是字符串,功能 为需要打开的文件分配一个缓冲区,并返回该缓冲区的首地址给文件型指针变量fp。以后对文件的访问通过指针变量fp进行。,文件的打开,r 只读 为输入打开一个文件

7、。若指定的文件不存在,则返回 空指针值NULL。w 只写 为输出建立一个新文件。若指定的文件已存在,则其 中原有内容被删去;否则创建一个新文件。a 追加写 向文件尾增加数据。若指定的文件不存在,则创建 一个新文件。r+读写 为读写打开一个文件。若指定的文件不存在,则返 回空指针值NULL。w+读写 为读写打开一个新文件。若指定的文件已存在,则 其中内容被删去;否则创建一个新文件。a+读与追加写为读与向文件尾增加数据打开一个文件。若指定的文件不存在,则创建一个新文件。如果在后面附加“b”,则表示打开的是二进制文件,否则默认为打开的是文本文件。,教学进程,文件的打开,教学进程,在打开一个文件时有时

8、会出错。,在一般的C程序中,常采用以下方式来打开文件:FILE*fp;if(fp=fopen(文件名,文件使用方式)=NULL)printf(cannot open this file!n);exit(0);/*终止调用过程*/,在以上述方式打开文件时,如果出现“打开”错误,fopen()函数返回空指针值,程序就显示以下信息:cannot open this file!并退出当前的调用过程。,教学进程,fclose(fp);,主要功能是将由fp指向的缓冲区中的数据存放到外存文件中,然后释放该缓冲区。当文件被关闭后,如果想再对该文件进行操作,则必须再打开它。虽然C语言允许打开多个文件,但打开的文

9、件个数是有限的。如果不关闭已经处理完的文件,当打开的文件个数很多时,会影响对其它文件的打开操作。因此,建议当一个文件使用完后应立即关闭它。函数的返回值 当顺利关闭后,返回值为0,否则返回EOF(-1).,文件的打开与关闭,10.2,10.2.2 文件的关闭,fclose()函数,教学进程,文件的顺序读写,10.3,10.3.1 向文件读写一个字符,1.用fputc函数向文件写入一个字符 调用形式:fputc(ch,fp);函数功能:将字符(ch的值)输出到fp所指向的文件中去。返 回 值:如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF。,教学进程,其中fp为文件类型的指针

10、,指向已打开的文件。主要适用于文本文件的读写。,2.用fgetc函数从文件读入一个字符调用形式:ch=fgetc(fp);函数功能:从以读或读写方式打开的文件中读一个字符到变量ch中。返 回 值:如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标志EOF(即-1)。,字符读写函数,教学进程,【例10.1】从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“”为止。#include#include void main(void)FILE*fp;char ch,filename10;scanf(%s,filename);if(fp=fopen(filename,w)=NU

11、LL)printf(cannot open filen);exit(0);/*终止程序*/,字符读写函数,教学进程,【例】从文件a.dat中顺序读入字符并在屏幕上显示输出。#include stdio.h main()FILE*fin;char c;if(fin=fopen(a.dat,r+)=NULL)printf(cannot open this file!n);exit(0);c=fgetc(fin);/*从文件读取一个字符*/,教学进程,判文件结束函数feof(),在C语言中,只有文本文件才是以EOF作为文件结束标志的,而二进制文件不是以EOF作为文件结束标志的。为此,C语言提供了一个

12、feof()函数,专门用来判断文件是否结束。,判文件结束函数的一般形式为 feof(fp)其中fp指向已打开的文件。,feof()函数既可以用来判断二进制文件,也可以用来判断文本文件。,在读fp指向的文件时判断是否遇到文件结束。如果遇到文件结束,则函数feof(fp)的返回值为1;否则返回值为0。,功能,教学进程,#include#include main()FILE*in,*out;char ch,infile10,outfile10;printf(Enter the infile name:n);scanf(%s,infile);printf(Enter the outfile name:

13、n);scanf(%s,outfile);if(in=fopen(infile,r)=NULL)printf(cannot open infilen);exit(0);if(out=fopen(outfile,w)=NULL)printf(cannot open outfilen);exit(0);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);,【例10.2】将一个磁盘文件中的信息复制到另一个磁盘文件中。分析:应设两个文件指针,一个用来读,一个用来写。,字符读写,教学进程,读字符串函数的一般形式为 fgets(str,n,

14、fp)其中fp为文件类型的指针,指向已打开的文件;str是一个字符串指针;n是一个整型变量,也可以是整型常量或整型表达式。,需要指出的是,在执行fgets()的过程中,如果在未读满n-1个字符时,就已经读到一个换行符或文件结束标志EOF,则将结束本次读操作,此时读入的字符就不够n-1个了。,10.3.2 向文件读写一个字符串,教学进程,写字符串函数的一般形式为 fputs(str,fp)其中fp为文件类型的指针,指向已打开的文件,str可以是一个字符串常量,也可以是一个指向字符串的指针,还可以是存放字符串的数组名。,需要指出的是,在利用函数fputs()将字符串写到文件的过程中,字符串中最后的

15、字符串结束符0并不写到文件,也不自动加换行符n。因此,为了便于以后的读入,在写字符串到文件时,必要时可以人为地加入如“n”这样的字符串。,教学进程,【例10.3】从键盘读入若干个字符串,对它们按字母顺序排序,然后把它们送到磁盘文件中保存。,分析:从键盘输入n个字符,存放在一个二位字符数组中,每一行存放一个字符串;对字符数组中的n个字符串按字母顺序排序,排好序的字符串仍存在字符数组中;将字符数组中的字符串顺序输出。,#include#include#include void main()FILE*fp;char str310,temp10;int i,j,k,n=3;,教学进程,printf(E

16、nter strings:n);for(i=0;i0)k=j;if(k!=i)strcpy(temp,stri);strcpy(stri,strk);strcpy(strk,temp);if(fp=fopen(D:CCtempstring.dat,w)=NULL)printf(cant open file!n);exit(0);printf(nThe new sequence:n);for(i=0;in;i+)fputs(stri,fp);fputs(n,fp);printf(%sn,stri);,格式读写函数,教学进程,格式读函数一般形式为 fscanf(文件指针,格式控制,地址表),从指定

17、的文件中按格式读数据。,功能,格式化写数据到指定的文件中。,功能,10.3.3 向文件进行格式化读写,格式写函数一般形式为 fprintf(文件指针,格式控制,输出表),例:fprintf(fp,”%d,%6.2f”,i,t);fscanf(fp,”%d,%f”,数据块读写函数,教学进程,数据块读函数一般形式为 fread(buffer,size,count,fp),功能,从指定的文件中读入一组数据。,其中:buffer 存放读入数据在内存的首地址。size 每个数据项的字节数。count 数据项个数。fp 文件类型指针,指向已打开的文件,数据块写函数一般形式为 fwrite(buffer,s

18、ize,count,fp),将一组数据写到指定的文件中。,其中:buffer 输出数据的首地址。size 每个数据项的字节数。count 数据项个数。fp 文件类型指针,指向已打开的文件。,功能,10.3.4 向文件读写一组数据,如:文件以二进制形式打开 fread(f,4,2,fp);此语句从fp所指向的文件中读入2个4个字节的数据,存储到数组 f 中。,若有如下结构类型:struct student_typechar name10;int num;int age;char addr30;stud40;可以用fread和fwrite来进行数据的操作:for(;)fread(,教学进程,voi

19、d save()FILE*fp;int i;if(fp=fopen(stu-list,wb)=NULL)printf(cannot open filen);return;for(i=0;iSIZE;i+)/*二进制写*/if(fwrite(/*调用save函数保存学生信息*/,教学进程,#include#define SIZE 4struct student_type char name10;int num;int age;char addr15;studSIZE;/*定义结构题变量*/,【例10.4-1】从键盘输入个学生的有关数据,然后把它们转存到磁盘文件上去。,void main()int

20、 i;FILE*fp;if(fp=fopen(stu_list,rb)=NULL)/*打开输出文件atu_list*/printf(cannot open filen);return;for(i=0;iSIZE;i+)fread(,教学进程,#include#define SIZE 4struct student_type char name10;int num;int age;char addr15;studSIZE;/*定义结构题变量*/,【例10.4-2】将以上数据读出并显示。,教学进程,10.4.1 文件位置指针的定位,其形式为 rewind(fp)其中fp是已经打开的文件指针。,1

21、用rewind()函数使位置指针指向文件头,文件的随机读写,10.4,顺序读写:位置指针按字节(物理)位置顺序移动。随机读写:可以对任何位置上的数据进行访问。读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读些文件中任意位置上所需要的字符(字节)。,将文件的读写指针移动到文件的开头,此函数没有返回值。,功能,教学进程,【例10.5】有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。,文件的随机读写,#includevoid main()FILE*fp1,*fp2;fp1=fopen(file1.c,r);fp2=fopen(file2.c,w);w

22、hile(!feof(fp1)putchar(getc(fp1);/*输出到屏幕*/rewind(fp1);/*位置指针返回到文件头*/while(!feof(fp1)putc(getc(fp1),fp2);/*从文件file1的头读起,输出到文件file2中*/fclose(fp1);fclose(fp2);/*关闭文件*/,教学进程,2 用fseek()函数移动位置指针,将文件的读写指针移动到指定的位置。,起始位置是指移动文件读写指针的参考位置,它有以下三个值:SEEK_SET或0 表示文件头 SEEK_CUR或1 表示当前读写的位置 SEEK_END或2 表示文件尾位移量是指以“起始位置

23、”为基点,读写指针向文件尾方向移动的字节数。这个参数的类型要求为长整型。,功能,文件的随机读写,其形式为 fseek(文件指针,位移量,起始位置),教学进程,fseek函数应用举例:,fseek(fp,100L,);将位置指针移到离文件头100个字节处fseek(fp,50L,);将位置指针移到离当前位置50个字节处fseek(fp,50L,);将位置指针从文件末尾处向后退个字节,文件的随机读写,教学进程,得到流式文件中的当前位置,用相对于文件开头的位移量来表示。,其形式为 ftell(fp),3 用ftell()函数测定位置指针的当前位置,功能,文件的随机读写,返回值:返回当前位置,出错时返

24、回-1L。例:i=ftell(fp);if(i=-1L)printf(“errorn”);,教学进程,文件的随机读写,10.4.2 随机读写,【例10.6】在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。,#include#includestruct student_type char name10;int num;int age;char sex;stud10;,void main()int i;FILE*fp;if(fp=fopen(stud-dat,rb)=NULL)printf(can not open filen);exit(0)

25、;for(i=0;i10;i+=2)fseek(fp,i*sizeof(struct student_type),0);fread(,文件读写的出错检测,10.5,教学进程,(1)ferror函数调用形式:ferror(fp);返回值:返回0,表示未出错;返回非0,表示出错。在调用一个输入输出函数(如:putc、getc、fread、fwrite等)后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为。,文件读写的出错检测,10.5,教学进程,(2)clearerr函数调用形式:clearerr(fp);作用:使文件错误标志和文件结束标志置为

26、0。只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。,教学进程,程序举例,#include stdio.h main()long count=0;FILE*fp;if(fp=fopen(letter.txt,r+)=NULL)printf(cannot open this file!n);exit(0);fgetc(fp);while(!feof(fp)fgetc(fp);count=count+1;printf(count=ldn,count);fclose(fp);,【例】统计文件letter.txt中的字符个数。,教学进

27、程,#include stdio.h main()long p;FILE*fp;if(fp=fopen(gg.txt,a)=NULL)printf(cannot open this file!n);exit(0);p=ftell(fp);printf(p=ldn,p);fprintf(fp,data);p=ftell(fp);printf(p=ldn,p);fclose(fp);,【例】下列C程序的功能是,用“追加”的形式打开文件gg.txt,查看文件读写指针的位置,然后向文件写入“data”,再查看文件读写指针的位置。,程序举例,本章小结,文件是外部介质上数据的集合。文件标识是系统查找文件的依据,包括:路径、主文件名、扩展名。数据文件有两类:ASCII文件和二进制文件。为每一个使用的文件在内存中开辟文件缓冲区。文件的指针是指向FILE类型数据的,具体指向某一文件的开头。文件使用的步骤:打开、操作、关闭。具体操作是通过指向文件的指针变量来完成的。对文件读写的两种方式:顺序读写、随机读写。对文件操作的函数见表10-3。,教学进程,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号