资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,文件,2,目录,文件的概念,文件的使用,结合介绍计算机及程序中一些相关问题和概念,标准输入输出函数与格式控制,输入输出中的格式控制问题,3,数据文件,数据集合,外部设备,数据文件,.,文件:存储在外部介质上的数据的集合。,4,数据是以文件的形式存储在外部介质上。操作系统是以文件为单位对数据进行管理的。,只有将数据存放到外部介质上,才能保存下来。,如果需要向外部介质,存储数据,,需要先建立一个文件,为文件确定名称,然后向他,输出,数据;,如果需要从外部文件,读取数据,,首先按文件名找到该文件,将他打开,执行,读,操作。,5,文件分类,按文件的内容,程序文件,和,数据文件,按文件的组织形式,顺序存取文件,和,随机存取文件,按文件的存储形式,ASCII,码文件,(文本文件)和,二进制文件,ASCII,代码文件(文本文件),ASCII,码文件,:比如使用记事本生成的,.txt,文件,用,Visual C+,生成的,C,源程序,.cpp,等。,由一个一个,字符,组成,每个字符用一个,ASCII,代码表示。,如,:,123.45,以,ASCII,代码形式存储到磁盘需要,6,个字节。,特点:,文本文件主要是作为文档供人们阅读的,可以从显示器上显示出来,也可以通过打印机打印出来,比较直观。,6,二进制文件(非文本文件),二进制文件,:比如使用,Visual,C+,编译生成的,.obj,文件及,.exe,文件等。,二进制文件是指以数据在内存中的,存储形式,原样输出存储到磁盘上的文件。,如,123.45,在内存中以浮点数形式存储占,4,个字节,不管一个实数多大都占,4,个字节。,特点,:二进制文件主要是暂时存放中间结果,以后还要继续处理,比如,.obj,文件。节省存储空间,输入输出无需转换,速度快,不便阅读。,7,8,00110000 00111001,二进制文件,00110001 00110010 00110011 00110100 00110101,ASCII,码文件,00110000 00111001,内存中的数据:,ASCII,码、二进制文件的存储,例:一个十进制数,12345,49,50,51,52,53,9,C,语言对文件的处理方法:,缓冲文件系统:,系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为,高级磁盘输入输出,。,非缓冲文件系统:,系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为,低级输入输出系统。,10,说明,:,在,UNIX,系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统来处理二进制文件。,ANSI C,标准只采用缓冲文件系统来处理文本文,件和二进制文件。,C,语言中对文件的读写都是用库函数来实现。,缓冲文件系统,内存单元 内存单元,数据,缓冲器,512,字节,文件,由操作系统自动完成,程序控制,由于磁盘速度慢,直接把数据写到磁盘效率很低,11,缓冲文件系统,向磁盘输出数据:数据 缓冲区,装满缓冲区后 磁盘文件。,从磁盘读入数据:先,一次性,从磁盘文件将,一批数据输入,到缓冲区,然后再从缓冲区,逐个,读入数据到变量,。,数据,缓冲器,512,字节,文件,由操作系统自动完成,程序控制,文件名,内存单元 内存单元,用什么标识,12,缓冲文件与文件类型指针,用文件指针指示文件缓冲区中具体读写的位置,FILE,*,fp,;,数据,缓冲器,512,字节,文件,由操作系统自动完成,程序控制,fp,同时使用多个文件时,每个文件都有缓冲区,用不同的文件指针分别指示。,13,FILE,:结构类型,用,typedef,定义,,stdio.h,typedef,struct,short level;/*,缓冲区使用量 *,/,unsigned flags;/*,文件状态标志*,/,char fd;/*,文件描述符*,/,short bsize;/*,缓冲区大小*,/,unsigned char *buffer;/*,文件缓冲区的首地址*,/,unsigned char *curp;/*,指向文件缓冲区的工作指针*,/,unsigned char hold;/*,其他信息*,/,unsigned istemp;,short token;,FILE,;,文件结构,FILE,14,文件类型指针,FILE*,fp,指向文件缓冲区,通过移动指针实现对文件的操作,数据,缓冲器,512,字节,文件,由操作系统自动完成,程序控制,fp,同时使用多个文件时,每个文件都有缓冲区,用不同的文件指针分别指示。,如何使,fp,与具体,文件,挂钩,?,15,16,文件类型指针,每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息。如文件名字、文件状态及文件当前的位置等。,文件的这些信息保存在一个结构体变量中,该结构体类型是由系统定义的,名称为,FILE,。,在进行文件操作时,需要使用文件类型的变量,定义格式:,FILE*fp,;通过,fp,实现对文件的各种操作。,流与缓冲,打开文件时程序会为流隐含建立,缓冲区,,文件与程序间数据传递都通过缓冲区进行。,文件关闭时释放流缓冲区。,虽然程序与文件间有缓冲区,但操作中看不到它的影响(“透明性”),,程序就像是直接在与外存打交道,。,“透明性”,思想在计算机领域里非常重要,是许多设计的基础。在许多领域里都能够用到。例如网络传输,数字电话等等。,拧开水龙头时,你会考虑水是从哪儿来的吗?走的哪条管子,在哪个水塔上存过吗?,17,流操作,C,标准库提供一套函数,包括流创建(打开文件),撤消(关闭文件),文件读写(通过流对文件读写)等,流的表示,通过特殊数据结构实现,标准库定义了一个类型,FILE,,,FILE,中存储与流操作(,IO,文件)有关的信息,文件打开操作返回,一个指向,FILE,的指针,(文件指针),代表所建流,对流的操作都通过这种,FILE,指针进行,可以认为文件指针就是流的具体体现,18,主要内容,文件的概念,文件的使用,结合介绍计算机及程序中一些相关问题和概念,标准输入输出函数与格式控制,输入输出中的格式控制问题,19,文件的使用,通过重新定向可以将文件作为,IO,对象,把与标准设备(键盘、显示器)连接的标准流转连到指定文件,这种做法有很大局限性:,形成的定向在程序执行中不能改变,无法使用多个文件(只有流,stdin,和,stdout,),为了在程序中方便地使用文件,需要利用标准库的文件操作函数,通过建立输入输出流的方式使用文件。,D:count output.txt,20,21,文件的操作过程,打开,读,/,写,关闭,文件必须先打开,,之后及时关闭!,22,含义,:建立文件的各种有关信息,并使文件指针指向该文件。,打开文件,文件指针,:,是指向文件的一个指针变量。,文件指针的定义格式如下,:,FILE*,指针变量标识符;,23,FILE,结构体类型,typedef struct,int _fd;,int _cleft;,int_mode;,char*_nextc;,char*_buff;,FILE;,文件号,缓冲区中剩下的字符,文件操作的模式,下一个字符的位置,文件缓冲区的位置,24,打开文件,fopen,打开文件,返回,FILE,指针,若文件打开出错,,fopen,返回空指针值,通过这种指针可进行各种文件操作。,原型,FILE*fopen(const char*filename,const char*mode),filename,是文件名;,mode,指明文件打开方式。,文件打开以后必须要检查指针是否为空,以确保正确地打开了一个文件,25,文件的打开,文件的打开,fopen(),函数,fopen(,文件名,使用方式),驱动器:路径文件名,例如:,fopen(,d:fileexampl.cpp,r,);,该函数返回指向打开的文件的文件指针;,如果在打开文件时发生错误,则,fopen,返回,NULL,(空指针),如果不指定路径,则默认打开的文件与,C,程序在同一个目录下,26,使用方式:,文本文件,二进制文件,+(,读,/,写,),b(,二进制,),b+r,只读:,r,r+,rb,rb+w,只写:,w,w+,wb,wb+a,追加:,a,a+,ab,ab+,27,文件使用方式含 义,“,r,”,(,只读,),为,输入,打开一个,文本,文件,“,w,”,(,只写,),为,输出,打开一个,文本,文件,“,a,”,(,追加,),向,文本,文件尾增加数据,“,rb,”,(,只读,),为,输入,打开一个,二进制,文件,“,wb,”,(,只写,),为,输出,打开一个,二进制,文件,“,ab,”,(,追加,),向,二进制,文件尾增加数据,“,r+,”,(,读写,),为,读,/,写,打开一个,文本,文件,“,w+,”,(,读写,),为,读,/,写建立,一个新的,文本,文件,“,a+,”,(,读写,),为读,/,写打开一个文本文件,“,rb+,”,(,读写,),为读,/,写打开一个,二进制,文件,“,wb+,”,(,读写,),为读,/,写,建立,一个新的,二进制,文件,“,ab+,”,(,读写,),为读,/,写打开一个,二进制,文件,如果输入文件不存在或,未找到,则,fopen,失败,如果输出文件已存,在,内容将全覆盖,如果该文件不存,,则先建立该文件,以读写方式打开文件,使用时有特殊规定,:(1),在读写间进行切换时,必须做文件的重新定位,;(2),并调用函数,fflush,刷新缓冲区,28,例如:,if(fp=fopen(,filename,r,)=,NULL,),printf(Cant open this file!n);,exit(1);,终止程序,空指针,29,程序运行时:,系统自动打开,标准文件:,标准输入,标准输出,标准出错输出,系统自动定义,文件指针:,stdin,stdout,stderr,输入文件:终端键盘 输出文件:显示屏和打印机,每一个与主机相连的输入输出设备看作是一个文件。,C,的标准文件指针,程序启动时自动建立三个文件指针,标准输入流,stdin,标准输出流,stdout,标准错误流,stderr,stdin,与,OS,标准输入连接,stdout,与标准输出连接,stderr,通常直接与显示设备连接,不能重新定向,标准输入输出操作,getchar,,,scanf,,,putchar,等都是对这些流(,stdin,,,stdout,)进行的,30,关闭文件,能同时打开的文件数有限,文件用完后应关闭流,关闭文件用函数,fclose,,原型:,int fclose(FILE*stream),正常时返回,0,,否则返回,EOF,。,对于输出流,即执行写操作的文件,关闭前将输出流缓冲区的数据送入文件;而后释放缓冲区。,对于输入流,即打开只用来读的文件,关闭时丢弃文件缓冲区中的内容。,程序退出时所有文件将自动关闭,31,32,文件的关闭,fclose(),函数,fclose(,文件指针),例如:,fclose(fp);,文件关闭,关闭文件含义,:,断开指针与文件之间的联系,禁止再对该文件进行操作,。,该函数调用成功会返回,0,,调用失败会返回,EOF(-1),。,主要内容,文件的概念,文件的使用,结合介绍计算机及程序中一些相关问题和概念,标准输入输出函数与格式控制,输入输出中的格式控制问题,33,34,文件的读写,内存,磁盘文件,写,读,分为:顺序读写和随机读写,35,字符读写函数,fgetc(),和,fputc(),行式读写函数,fgets(),和,fputs(),格式化读写函数,fscanf(),和,fprintf(),读写数据块的函数,fread(),和,fwrite(),文件的顺序读写,:,36,读写一个字符的函数,fgetc(),和,fputc(),1,fgetc(),函数,int,fgetc,(FILE*fp),2.,fputc(),函数,int,fputc,(char ch,FILE*fp),37,读一个字符的函数,fgetc(),函数,int ch;,;,FILE*fp;,ch=fgetc(fp);,功能:从,fp,所指向的文件中读取一个字符并送入变量,ch,中。,1),在,fgetc(),函数调用中,,读取的文件,必须是以读或读写方式打开的。,2),读取字符的,结果,可以不向变量赋值,但是读出的字符不能保存。,3),在文件内部有一个位置指针,用来指向文件的当前读写字节。,在文件打开时,该指针总是指向文件的第一个字节。使用,fgetc,函数后,该指针将向后移动一个字节。因此可连续多次使用,fgetc,函数,读取多个字符。,4),当读到文件末尾或者函数执行出错时,函数返回,EOF(-1),38,例:读入文本文件,f1.txt,,,在屏幕上输出,#include,#include,void main(),char c;FILE*fp;,if(,fp=fopen(“f1,.txt,r),=NULL),printf(“Can,t open this file!n”);exit(,1,);,while(,(c=fgetc(fp),!=EOF)printf(%c,c);,printf(n);,fclose(fp);,39,40,写一个字符的函数,fputc(),函数,char ch;,;,FILE*fp;,fputc(ch,fp);,功能:将字符变量,ch,的值写入到文件指针,fp,所指向的文件中。,1),被写入的文件,可以用写、读写、追加的方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符从文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。,2),每写入一个字符,文件内部,位置指针,向后移一个字节。,3)fputc(),函数有一个,返回值,,如写入成功则返回写入的字符,否则返回一个,EOF,。可以用此来判断写入是否成功。,41,例:从键盘输入一行字符,写入一个文件,c2.txt,中。,#include,#include,void main(),FILE*fp;char ch;,if,(fp=fopen(c2.txt,w+)=NULL),printf(Cannot open file!);exit(1);,printf(input a string:n);ch=getchar();,while(ch!=n),fputc(ch,fp);,ch=getchar();,fclose(fp);,文件输入输出函数,字符,IO,函数,原型,int fgetc(FILE*fp);/,从流,fp,读字符,int fputc(int c,FILE*fp);/,向,fp,写字符,返回所读或所写的字符。,遇文件结束,fgetc,返回,EOF,,出错时也返回,EOF,。返回值是,int,类型,原因与,getchar,相同。,getc,和,putc,与上述函数类似,用宏实现,#define getc(fp)fgetc(fp),#define putc(c,fp)fputc(c,fp),标准流的字符读写函数通常如下定义,#define getchar()getc(stdin),#define putchar(c)putc(c,stdout),void filecopy(FILE*ifp,FILE*ofp)/*,文件复制*,/,int c;,while(c=getc(ifp)!=EOF)putc(c,ofp);,int main(int argc,char*argv),FILE*ifp;,char*name=argv0;,if(argc=1)/*,无参数情况*,/,filecopy(stdin,stdout);,return 0;,while(*+argv!=NULL),if(ifp=fopen(*argv,r)=NULL),printf(%s,cant open input file:%sn,name,*argv);,else,filecopy(ifp,stdout);fclose(ifp);,return 0;,例:,Cat,程序,将命令行参数作为文件名,顺序复制到标准输出;无文件名时由,stdin,向,stdout,复制。,44,行式读写的函数,fgets(),和,fputs(),1.,fgets(),char*,fgets,(char*buff,int n,FILE*fp),2.,fputs(),int,fputs,(char*str,FILE*fp),45,读字符串的函数,fgets(),FILE*fp;char strn;,fgets(str,n,fp);,功能:从,fp,所指的文件中读出,n-1,个字符送,入字符数组,str,中。,在读出,n-1,个字符之前,如遇到了换行符,或,EOF,,则读出结束。,2)fgets(),函数的返回值是字符数组的首地,址。,3),若文件结束或出错,则返回,NULL,。,46,例:从,c3.txt,文件中读入一个含,10,个字符的字符串,并从显示器输出。,#include,#include,void main(),FILE*fp;char str10;,if,(fp=fopen(c3.txt,r)=NULL),printf(Cannot open file!);exit(1);,fgets(str,11,fp);,puts(str);,fclose(fp);,47,48,写字符串的函数,fputs(),FILE*fp;char strn;,fputs(str,fp);,功能:把字符数组,str,的内容写入,fp,所指的文件中。,fputs(“abcd”,fp);,功能:把字符串,“,abcd,”,写入,fp,所指的文件中。,char*ch;,fputs(ch,fp);,功能:把指针,ch,所指的字符串写入,fp,所指的文件中。,本函数执行成功时返回非负值,,否则返回,EOF(-1),。,49,例:从键盘输入一行字符,使用,fputs,写入文件,c3.txt,中。,#include,#include,void main(),FILE*fp;char st20;,if,(fp=fopen(c3.txt,w+)=NULL),printf(Cannot open file!);exit(1);,printf(input a string:n);,gets(st);,fputs(st,fp);,fclose(fp);,行式,IO,函数,以行为单位进行输入或输出。行,IO,函数需要用字符数组存放输入或者输出字符序列。,fgets,char*fgets(char*buffer,int n,FILE*stream);,buffer,为字符数组。由流,stream,读至多,n-1,个字符存入,buffer,,,遇换行符结束,换行符存入数组。最后放,0,。,正常结束时返回,buffer,,文件结束或出错时返回空指针。,buffer,应至少能容纳,n,个字符。,行式,IO,fputs,int fputs(const char*buffer,FILE*stream);,将,buffer,表示的字符串送到流,stream,输出的最后不向流中添换行字符(串里可以包含换行),。,正常完成时返回非负值,出错时返回,EOF,值。,#include,int main(),FILE *fp;,char string81;,if(,fp=fopen(file.txt,w)=NULL,),printf(cannt open file);,exit(0);,while(strlen(gets(string)0),fputs(string,fp);,fputs(n,fp);,fclose(fp);,if(,fp=fopen(file.txt,r)=NULL,),printf(cannt open file);,exit(0);,while(fgets(string,81,fp)!=NULL),fputs(string,stdout);,fclose(fp);,return 0;,例:从键盘读入字符串存入文件,再从文件读回显示。,53,格式化读写函数,fscanf(),和,fprintf(),1.,fscanf(),函数,fscanf,(,文件指针,格式字符串,输入地址表列),2,fprintf(),函数,fprintf,(,文件指针,格式字符串,输出表列),格式化读写函数是按照格式字符串规定,的格式来读文件和写文件,它们的功能,类似于,scanf,和,printf,。两类函数的区别,在于前者操作对象是文件,而后者的操,作对象为键盘和显示器。,54,关键语句:,fscanf(fp,“%d%s”,&i,s),;,例:从,fp,所指的文件中读出一个整数和一个字符串赋给变量,i,和指针,s,所指的空间,55,例:将一个整数和一个字符串写入文件,test.dat,#include,#include,void main(),char*s=Thats good news;,int i=617;FILE*fp;,if(fp=fopen(test.dat,w)=NULL),printf(Cannot open file!);exit(1);,fprintf(fp,%d%s,i,s);,fclose(fp);,56,例:从键盘输入,6,个整数,将其写入文件,f1.dat,,再将其从文件中读出,输出到屏幕上。,#include,#include,#define n 6,void main()FILE*fp;int i,x;,if,(fp=fopen(“f1.dat,w+)=NULL),printf(Cant open this file!n);exit(1);,57,for(i=0;in;i+),scanf(%d,fprintf(fp,%6d,x),;,fclose(fp);,if,(fp=fopen(“f1.dat,r+)=NULL),printf(Cant open this file!n);exit(2);,for(i=0;in;i+),fscanf(fp,%d,printf(%6d,x);,printf(n);,fclose(fp);,for(i=0;iNO;i+),fprintf(fp,%s%d%d%d%5.1f,studi.name,studi.score0,studi.score1,studi.score2,studi.ave);,请阅读下列程序片断:,58,例,:从键盘输入一个整数、一个实数、一个字符,将其写入文件,new.txt,,再将其从文件中读出,输出到屏幕上。,问题分析,:本例可以先分别定义一个整型、实型、字符型变量,再从键盘各输入一个值,使用,fprintf(),函数将三个值按相应格式写入到文件,new.txt,中,再使用,fscanf(),函数从文件中读出,并使用格式输出,printf(),函数输出到屏幕上。,59,#include,#include,void,main(),int a,a1;float b,b1;char c,c1;,FILE *fp;,if(,fp=fopen(new.txt,w+),)=NULL),printf(Cannot open file!n);exit(1);,printf(“Please a,b,c:);,scanf(%d,%f,%c,fprintf(fp,%d,%f,%c,a,b,c);,fclose(fp),;,fp=fopen(new.txt,r),;,fscanf(fp,%d,%f,%c,printf(%d,%f,%cn,a,b,c);,printf(%d,%f,%cn,a1,b1,c1);,fclose(fp),;,60,例,:,设,文件保存了一批单价和数量数据。写程序通过命令行参数提供文件名,最终输出货物的总货值,设有函数,nextentry,完成一对数据的读入,它在发现所有数据处理完毕后返回,0,值,double nextentry(FILE*fp),double pr,num;,int n=fscanf(fp,%lf%lf,return n=EOF?0.0:pr*num;,这里没处理数据出错情况,可补充修改。,int main(int argc,char*argv),double total=0.0,x;,FILE*ifp;,if(argc=1)/*,缺参数,产生错误信息,*,/,printf(Missing file name.Stop!n);,return 1;,if(ifp=fopen(argv1,r)=NULL),printf(Cant open:%s.Stop!n,argv1);,return 2;,while(x=nextentry(ifp)!=0.0),total+=x;,printf(Total price:%fn,total);,flose(ifp);,return 0;,直接输入输出函数,格式化函数,fscanf,、,fprintf,工作时,要做内外部形式之间的转换。,如,int,内部是二进制序列,实际输出的是一串数字字符。格式化输入函数也要做转换,数据转换要耗费时间。,如,IO,对象是人,就必须进行转换。,若要输出到文件,以便后来取回程序使用,转换就没必要了,转换还可能丢失信息,尤其是对浮点(,double,等)数据,输出后再输入可能产生误差。,为解决这些问题,标准库提供二进制流和直接,IO,函数,fread,fwrite,如果程序里需要保存起一些内部信息,以便随后使用或下次执行程序时再用,合适方式是用二进制流,直接将内部数据保存到文件里。,直接输入输出函数:,size_t fread(void*p,size_t size,size_t num,FILE*stream),size_t fwrite(const void*p,size_t size,size_t num,FILE*stream),fread,由,stream,读,num,个大小,size,的元素。,p,应指数组,数组元素类型应与,size,一致,数组大小至少为,num,。,fread,返回实际读入元素的个数。,fwrite,向,stream,输出,num,个大小为,size,的数组元素,,p,指定数据的起始位置,各数据项顺序写入指定文件。返回输出的元素个数,小于,num,说明出错。,对二进制流,应该用,feof,检查是否遇到文件结束,文件结束判断函数:,int feof(FILE*stream),65,读写数据块的函数,fread(),和,fwrite(),1.,fread(),函数,int,fread,(char*buffer,int size,int count,FILE*fp),2.,fwrite(),函数,int,fwrite,(char *buffer,int size,int count,FILE*fp),66,buffer:,存放读/写数据的起始地址。,size:,数据块的字节数。,count:,读/写的数据块块数。,fp:,文件指针。,函数调用成功:返回,count,的值。,int,fread,(char*buffer,int size,int count,FILE*fp),67,功能:从,fa,所指空间中,每次输出,4,个字节,(一个实数)到,fp,所指的文件中,,连续写,5,次,即写,5,个实数到,fp,所指,文件中。,fwrite,(fa,4,5,fp);,68,例:把一个浮点数组以二进制方式写入文件,test.dat,中,#include,#include,void main(),float f6=3.2f,-4.34f,25.04f,0.1f,50.56f,80.5f;,FILE*fp;,if,(fp=fopen(test.dat,wb)=NULL),printf(Cannot open file!);exit(1);,fwrite(f,sizeof(float),6,fp);,fclose(fp);,69,功能:从,fp,所指的文件中,每次读,4,个字节,(一个实数)送入,fa,所指的空间中,,连续读,5,次,即读,5,个实数到,fa,所指,空间中。,fread,(fa,4,5,fp);,70,例:将,100,个整数写入,test.dat,文件中,再从,test.dat,文件中读,100,个整型数,并把它们放到,myarr,数组中。,#include,#include,void main(),int Iarr100,myarr100,i;,FILE*fp;,for(i=0;i100;i+),Iarri=i;,if(,fp=fopen(test.dat,wb),)=NULL),printf(Cannot open file!);,exit(1);,fwrite(Iarr,sizeof(int),100,fp);,fclose(fp),;,接下页,接上页,if(,fp=fopen(test.dat,rb),)=NULL),printf(Cannot open file!);,exit(2);,if(,fread(myarr,sizeof(int),100,fp),!=100),exit(3);,fclose(fp),;,for(i=0;iname,qq-num,qq-age,qq-addr);,标准错误流,输出出错信息是希望显示到屏幕供人读。通过,stdout,不合适:输出定向到文件也使出错信息送到文件。,送到标准错误流,stderr,的信息不受定向影响。改造前面程序,只需要改动一个语句:,fprintf(stderr,%s,cant open in file:%sn,name,*argv);,文件错误检查:,int ferror(FILE*stream),IO,出错时设置相关流的出错标志变量。,ferror,检查流的出错标志。当,stream,的状态变量设置时返回非,0,。,错误标志复位(清除)函数,void clearerr(FILE*stream),81,文件检测,ferror(),函数,测试文件操作是否出错,ferror(,文件指针),功能,:判断被操作文件的当前状态,返回,0值-未出错,非0值-出错,clearerr(),函数,清除文件的出错标志,clearerr(,文件指针),功能,:使文件错误标志和文件结束标志置为0。,82,feof(),函数,文件结束检测函数,int feof(FILE*fp),检测,fp,所指向的文件是否结束,0值-未结束,非0值-结束,83,文件输入输出小结,常见的错误:,使用文件打开/关闭函数时与使用方式不匹配。,混淆文件指针与位置指针的概念。,不能使文件正确定位,造成读/写文件错误。,忘记关闭文件,造成文件数据丢失。,例,:编程实现将文本文件,file1.dat,中的内容复制到文本文件,file2.dat,中去,同时将小写字母转换成大写字母。,【,解,】,先以读方式打开,file1.dat,文件,再以写方式打开,file2.dat,文件。从前者中读出字符,如果小写转换成大写后写入后者中,继续这一过程直到文件读完为止。程序如下:,84,#include,#include,void main(),FILE*fp1,*fp2;,char ch;,fp1=fopen(file1.dat,r);,fp2=fopen(file2.dat,w);,ch=fgetc(fp1);,while(ch!=EOF),if(ch=a&ch=z),ch=ch-32;,fputc(ch,fp2);,ch=fgetc(fp1);,fclose(fp1);fclose(fp2);,85,86,分类,函数名,功能,打开文件,fopen(),打开文件,关闭文件,fclose(),关闭文件,文件定位,rewind(),文件位置指针置于文件开头,fseek(),改变文件位置指针,文件操作小结:,常用的缓冲文件系统函数,:,87,分类,函数名,功能,文件的读写,fgetc(),从指定文件输入一个字符,fputc(),向指定文件输出一个字符,fgets(),从指定文件输入一个字符串,fputs(),向指定文件输出一个字符串,getw(),从指定文件输入一个字(整型),putw(),向指定文件输出一个字(整型),88,分类,函数名,功能,文件的读写,fread(),从指定文件输入一个数据块,fwrite(),向指定文件输出一个数据块,fscanf(),按指定格式从指定文件输入数据,fprintf(),按指定格式向指定文件输出数据,文件的状态,ferror(),测试文件操作是否出错,clearerr(),清除文件的出错标志,
展开阅读全文