《第十一章文件课件.ppt》由会员分享,可在线阅读,更多相关《第十一章文件课件.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计语言程序设计1第十一章第十一章-文件文件C语言程序设计语言程序设计2文件分类文件分类按文件的逻辑结构:按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不记录文件:由具有一定结构的记录组成(定长和不定长)定长)流式文件流式文件:由一个个字符(字节)数据顺序组成:由一个个字符(字节)数据顺序组成按存储介质:按存储介质:普通文件:存储介质文件(磁盘、磁带等)普通文件:存储介质文件(磁盘、磁带等)设备文件设备文件:非存储介质(键盘、显示器、打印机等):非存储介质(键盘、显示器、打印机等)按数据的组织形式:按数据的组织形式:文本文件文本文件: ASCII文件,每个字节存放一个字
2、符的文件,每个字节存放一个字符的ASCII码码二进制文件二进制文件:数据按其在内存中的存储形式原样存:数据按其在内存中的存储形式原样存放放C语言程序设计语言程序设计3如如 intint型数型数100001000000100111000100000010011100010000内存存储形式内存存储形式00100111000100000010011100010000二进制形式二进制形式00110001001100000011000000110000001100000011000100110000001100000011000000110000ASCIIASCII形式形式文本文件特点文本文件特点:
3、:存储量大、速度慢、便于对字符操作存储量大、速度慢、便于对字符操作二进制文件特点二进制文件特点: :存储量小、速度快、便于存放中间结果存储量小、速度快、便于存放中间结果C语言程序设计语言程序设计4n文件类型指针文件类型指针n文件结构体文件结构体FILE缓冲文件系统为每个正使用的文件在内存开辟缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息区1. 文件信息用系统定义的名为文件信息用系统定义的名为FILE的结构体描述的结构体描述2. FILE定义在定义在stdio.h中中typedef struct int _fd; /文件号文件号 int _cleft; /缓冲区中剩下的字符数缓冲区中
4、剩下的字符数 int _mode; /文件操作方式文件操作方式 char *_next; /文件当前读写位置文件当前读写位置 char *_buff; /文件缓冲区位置文件缓冲区位置FILE;C语言程序设计语言程序设计5n文件类型指针文件类型指针n指针变量说明:指针变量说明: FILE *fp;n用法:用法:n文件打开文件打开时,系统时,系统自动自动建立文件结构体,并把指向建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得它的指针返回来,程序通过这个指针获得文件信息文件信息,访问文件访问文件n文件关闭文件关闭后,它的文件结构体被释放后,它的文件结构体被释放C语言程序设计语言程序设计6
5、一、打开文件一、打开文件fopen函数原型:函数原型: FILE *fopen(char *name,char *mode)功能:按指定方式打开文件功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,返值:正常打开,为指向文件结构体的指针;打开失败,为为NULL“r+/rb+” (读写读写)“a/ab” (追加追加)“w/wb” (只写只写)“r/rb” (只读只读)“w+/wb+” (读写读写)“a+/ab+” (读写读写)为为输入输入打开一个文本打开一个文本/二进制文件二进制文件为为输出输出打开或建立一个文本打开或建立一个文本/二进制文件二进制文件为读为读/写打开一个
6、文本写打开一个文本/二进制文件二进制文件为读为读/写建立一个文本写建立一个文本/二进制文件二进制文件为读为读/写打开或建立一个文本写打开或建立一个文本/二进制文件二进制文件向文本向文本/二进制文件尾二进制文件尾追加追加数据数据文件使用方式文件使用方式含义含义C语言程序设计语言程序设计7三、文件的读写三、文件的读写n1.字符字符I/O:fputc与与fgetcnfputcn函数原型函数原型:int fputc(int c, FILE *fp)n功能:把一字节代码功能:把一字节代码c写入写入fp指向的文件中指向的文件中n返值:正常,返回返值:正常,返回c;出错,为出错,为EOFfgetc函数原型:
7、函数原型:int fgetc(FILE *fp)功能:从功能:从fp指向的文件中读取指向的文件中读取一字符一字符返值:正常,返回读到的返值:正常,返回读到的字符字符;读到文件尾或出错,读到文件尾或出错,为为EOFC语言程序设计语言程序设计8二、文件关闭二、文件关闭fclosen作用作用:使文件指针变量与文件使文件指针变量与文件“脱钩脱钩”,释放文件结构,释放文件结构体和文件指针体和文件指针n函数原型:函数原型:int fclose(FILE *fp)功能:关闭功能:关闭fp指向的文件指向的文件返值:正常关闭为返值:正常关闭为0;出错时出错时,非非0C语言程序设计语言程序设计9例例 从键盘输入字
8、从键盘输入字符符 逐个存到磁盘逐个存到磁盘文件中,直到文件中,直到 输输入入#为止为止#include main() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,w)=NULL) printf(cannot open filen);exit(0); printf(Please input string:); ch=getchar(); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp);C语言程序设计语言程序设计10#include main
9、() FILE *fp; char ch,*filename=“out.txt”; if(fp=fopen(filename,”r)=NULL) printf(cannot open filen); exit(0); while(ch=fgetc(fp)!=EOF) putchar(ch); fclose(fp);例、读文本文件例、读文本文件内容,内容, 并显示并显示C语言程序设计语言程序设计11feof函数原型:函数原型: int feof(FILE *fp)功能:判断文件是否结束功能:判断文件是否结束返值:文件结束,返回真(非返值:文件结束,返回真(非0);文件未结束,返);文件未结束,返
10、回回0#include main() FILE *in, *out; char ch,infile10,outfile10; scanf(%s,infile); scanf(%s,outfile); if (in = fopen(infile, r)= NULL) printf(Cannot open infile.n); exit(0); if (out = fopen(outfile, w)= NULL) printf(Cannot open outfile.n); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); f
11、close(out);C语言程序设计语言程序设计12n2.数据块数据块I/O:fread与与fwriten函数调用:函数调用:fread(buffer, size, count, fp)fwrite (buffer, size, count, fp)功能:读功能:读/写数据块写数据块返值:成功,返回读返值:成功,返回读/写的块数;出错或文件尾,返回写的块数;出错或文件尾,返回0说明:说明:buffer: 指向要输入指向要输入/输出数据块的首地址的指针输出数据块的首地址的指针size: 每个要读每个要读/写的数据块的大小(字节数)写的数据块的大小(字节数)count: 要读要读/写的数据块的个数
12、写的数据块的个数fp: 要读要读/写的文件指针写的文件指针fread与与fwrite 一般用于一般用于二进制文件二进制文件的输入的输入/输出输出C语言程序设计语言程序设计13例:从键盘输入4个学生数据,把他们转存到磁盘文件中去#include #define SIZE 2struct student_type char name10; int num; int age; char addr15;studSIZE;main() int i; for(i=0;iSIZE;i+)scanf(%s%d%d%s,studi.name,&studi.num, &studi.age,studi.addr);
13、 save(); display();void save() FILE *fp; int i; if(fp=fopen(“f:stu_dat,wb)=NULL) printf(cannot open filen); return; for(i=0;iSIZE;i+) if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1) printf(file write errorn); fclose(fp);void display() FILE *fp; int i; if(fp=fopen(“f:stu_dat,rb)=NULL) printf(c
14、annot open filen); return; for(i=0;iSIZE;i+) fread(&studi,sizeof(struct student_type),1,fp); printf(%-10s %4d %4d %-15sn,studi.name, studi.num,studi.age,studi.addr); fclose(fp);C语言程序设计语言程序设计143.格式化格式化I/O:fprintf与与fscanfn函数调用:函数调用:fprintf(fp,格式字符串,输出列表格式字符串,输出列表)fscanf(fp,格式字符串,输出列表格式字符串,输出列表)功能:按格式对
15、文件进行功能:按格式对文件进行I/O操作操作返值:成功返值:成功,返回返回I/O的个数的个数;出错或文件尾出错或文件尾,返回返回EOF例例 : fprintf(fp,“%d,%6.2f”,i,t); /将将i和和t按按%d,%6.2f格式输出到格式输出到fp文件文件 fscanf(fp,“%d,%f”,&i,&t); /若文件中有若文件中有3,4.5 ,则将则将3送入送入i, 4.5送入送入t例:例: 从键盘按格式输入数据存到磁盘文件中去从键盘按格式输入数据存到磁盘文件中去C语言程序设计语言程序设计15#include main() char s80,c80; int a,b; FILE *f
16、p; if(fp=fopen(test,w)=NULL) puts(cant open file); exit() ; fscanf(stdin,%s%d,s,&a);/*read from keaboard*/ fprintf(fp,%s %d,s,a);/*write to file*/ fclose(fp); if(fp=fopen(test,r)=NULL) puts(cant open file); exit(); fscanf(fp,%s%d,c,&b);/*read from file*/ fprintf(stdout,%s %d,c,b);/*print to screen*/
17、 fclose(fp);C语言程序设计语言程序设计164.字符串字符串I/O: fgets与与fputs函数调用:函数调用: fgets(s, n, fp) fputs(s, n, fp)功能:从功能:从fp指向的文件读指向的文件读/写一个字符串写一个字符串返值:返值:fgets正常时返回读取字符串的首地址;出错或文件尾,正常时返回读取字符串的首地址;出错或文件尾,返回返回NULLfputs正常时返回正常时返回0;出错为;出错为EOFC语言程序设计语言程序设计17例:例: 从键盘读入字符串存入文件,再从文件读回显示从键盘读入字符串存入文件,再从文件读回显示#includemain() FILE
18、 *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);C语言程序设计语言程序设计18从
19、功能角度来说,从功能角度来说,fread()和和fwrite()函数可以完成文件的函数可以完成文件的任何数据读写操作。任何数据读写操作。 但为方便起见,依下列原则选用:但为方便起见,依下列原则选用: 1读读/写写1个字符(或字节)数据时:选用个字符(或字节)数据时:选用fgetc()和和fputc()函数。函数。 2读读/写写1个字符串时:选用个字符串时:选用fgets()和和fputs()函数。函数。 3读读/写写1个(或多个)不含格式的数据时:选用个(或多个)不含格式的数据时:选用fread()和和fwrite()函数。函数。 4读读/写写1个(或多个)含格式的数据时:选用个(或多个)含格
20、式的数据时:选用fscanf()和和fprintf()函数。函数。读写函数的选用原则读写函数的选用原则C语言程序设计语言程序设计19四、文件的定位四、文件的定位n概念概念n文件位置指针文件位置指针-指向当前读写位置的指针指向当前读写位置的指针n读写方式读写方式n顺序读写:位置指针按字节位置顺序移动顺序读写:位置指针按字节位置顺序移动n随机读写:位置指针按需要移动到任意位置随机读写:位置指针按需要移动到任意位置nrewind函数函数n函数原型:函数原型: void rewind(FILE *fp)n功能:重置文件位置指针到文件开头功能:重置文件位置指针到文件开头n返值:无返值:无C语言程序设计语
21、言程序设计20#include main() FILE *fp1,*fp2; fp1=fopen(“f:file.txt,r); fp2=fopen(“f:file2.txt,w); while(!feof(fp1) putchar(getc(fp1); rewind(fp1); while(!feof(fp1) putc(getc(fp1),fp2); fclose(fp1); fclose(fp2);例例 对一个磁盘文件进行显示和复制两次操作对一个磁盘文件进行显示和复制两次操作C语言程序设计语言程序设计21nfseek函数函数n函数调用:函数调用:fseek(fp, offset, whe
22、nce)n功能:改变文件位置指针的位置功能:改变文件位置指针的位置n返值:成功,返回返值:成功,返回0;失败,返回非;失败,返回非0值值文件指针文件指针位移量(以起始点为基点位移量(以起始点为基点,移动的字移动的字节数节数)0 向后移动向后移动0 向前移动向前移动起始点起始点文件开始文件开始 SEEK_SET 0文件当前位置文件当前位置 SEEK_CUR 1文件末尾文件末尾 SEEK_END 2C语言程序设计语言程序设计22main() int i; FILE *fp; if(fp=fopen(studat,rb)=NULL) printf(cant open filen);exit(0);
23、for(i=0;i3;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread(&studi,sizeof(struct student_type),1,fp); printf(%s %d %d %sn, studi.name,studi.num,studi.age,studi.addr); fclose(fp);#include struct student_type int num; char name10; int age; char addr15;stud3;例、例、 磁盘文件上有磁盘文件上有3个学生数据,个学生数据,要求读入第要求读
24、入第1,3学生数据并显示学生数据并显示C语言程序设计语言程序设计23ftell函数函数函数原型:函数原型: long ftell(FILE *fp)功能:返回位置指针当前位置功能:返回位置指针当前位置(用相对文件开头的位移量用相对文件开头的位移量表示表示)返值:成功,返回当前位置指针位置;失败,返回返值:成功,返回当前位置指针位置;失败,返回-1L,C语言程序设计语言程序设计24#includestdio.h main() FILE *fp; char filename80; long length; gets(filename); fp=fopen(filename,rb); if(fp=N
25、ULL) printf(file not found!n); else fseek(fp,0L,SEEK_END); length=ftell(fp); printf(Length of File is %1d bytesn,length); fclose(fp); 例例 求文件长度求文件长度C语言程序设计语言程序设计25五、出错的检测五、出错的检测nferror函数函数n函数原型:函数原型: int ferror(FILE *fp)n功能:测试文件是否出现错误功能:测试文件是否出现错误n返值:未出错,返值:未出错,0;出错,非;出错,非0n说明说明n每次调用文件输入输出函数,均产生一个新的每
26、次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试函数值,所以应及时测试nfopen打开文件时,打开文件时,ferror函数初值自动置为函数初值自动置为0C语言程序设计语言程序设计26nclearerr函数函数n函数原型:函数原型: void clearerr(FILE *fp)n功能:使文件错误标志置为功能:使文件错误标志置为0n返值:无返值:无n说明:出错后,错误标志一直保留,直到对同一说明:出错后,错误标志一直保留,直到对同一文件调文件调clearerr(fp)或或rewind或任何其它一个或任何其它一个输入输出函数输入输出函数C语言程序设计语言程序设计27例例 f
27、error()与与clearerr()举例举例#include int main(void) FILE *stream; stream = fopen(DUMMY.FIL, w); getc(stream); if (ferror(stream) printf(Error reading from DUMMY.FILn); clearerr(stream); if(!ferror(stream) printf(Error indicator cleared!); fclose(stream); return 0;C语言程序设计语言程序设计28文件文件n#includenFILE *fp;nif
28、(fp=fopen(“a.dat”,打开方式打开方式)=NULL)printf(“cannot open this filen”);exit(0);n打开方式打开方式n写文件:写文件:“w” 、“a”n读文件:读文件: “r”n读写文件:读写文件: “w+” 、“a+” 、 “r+”C语言程序设计语言程序设计29文件(续)文件(续)n读读nfscanf、fgetc、fgets函数函数n写写nfprintf、fpuc、fputs函数函数n文件状态文件状态nwhile(!feof(fp)n关闭文件关闭文件nfclose(fp)C语言程序设计语言程序设计30输入输入n n个实数,把它存入个实数,把它
29、存入“abc.databc.dat”文件中,文件中,然后再从文件中读出,求它们的平均值,并将然后再从文件中读出,求它们的平均值,并将大于平均值的数据写入新的文件大于平均值的数据写入新的文件“overave.datoverave.dat” #includestdio #include.h#define N 10#define N 10main()main() intint i; i;float num,avefloat num,ave; ;FILE FILE * *fp1,fp1,* *fp2;fp2;fp1=fopen(abc.datfp1=fopen(abc.dat,w);,w);if(fp
30、1=NULL)if(fp1=NULL)printf(Cannot open thieprintf(Cannot open thie file!n); file!n); exit(0); exit(0); C语言程序设计语言程序设计31for(i=1;i=10;i+)for(i=1;iaveif(numave) )fprintffprintf(fp2,%fn,num);(fp2,%fn,num); fclose fclose(fp1);(fp1); fclose fclose(fp2);(fp2); C语言程序设计语言程序设计33解法二:解法二:fp=fopen(abc.dat,wbfp=fop
31、en(abc.dat,wb););for(i=0;in;i+)for(i=0;in;i+) if( if(fwritefwrite(&si,2,1,fp(&si,2,1,fp)!=1)!=1) printf printf(file write errorn);(file write errorn); fclose(fp fclose(fp););fp=fopen(abc.datfp=fopen(abc.dat,r);,r);for(i=0;in;i+)for(i=0;in;i+) freadfread(&sai,2,1,fp(&sai,2,1,fp)!=1)!=1) printf(filrea
32、d printf(filread errorn); errorn); sum+=sa sum+=sai;i; a=sum/n; a=sum/n; fclose(fpfclose(fp););C语言程序设计语言程序设计34#include stdio.h FILE *fp1, *fp2; main() char ch; if(fp1=fopen(file1.dat, = =NULL) exit (0); if(fp2=fopen(file2.dat, = =NULL) exit (0); while( ) ch=fgetc(fp1); fputc (ch, fp2); fclose(fp1);
33、fclose(fp2); C语言程序设计语言程序设计35文本文件文本文件a.dat、b.dat中每行存放一个数且均按从小到中每行存放一个数且均按从小到大存放。下列程序将这两个文件中的数据合并到大存放。下列程序将这两个文件中的数据合并到c.dat,文件文件c.dat中的数据也要从小到大存放。中的数据也要从小到大存放。# include# includevoid main()FILE *f1, *f2, *f3; int x, y; if(f1=fopen(a.dat, r)=NULL) printf(文件文件a.dat不能打开!不能打开!n); exit(0); if(f2=fopen(b.da
34、t, r)=NULL) printf(文件文件b.dat不能打开!不能打开!n); exit(0); C语言程序设计语言程序设计36if( (1) )=NULL printf(文件文件c.dat不能打开!不能打开!n); exit(0); fscanf(f1, %d, &x); (2) ; while(!feof(f1)&!feof(f2)if( (3) ) fprintf(f3, %dn, x); fscanf(f1, %d, &x); else fprintf(f3, %dn, y); fscanf(f2, %d, &y); C语言程序设计语言程序设计37if(feof(f1) (4) ;
35、 while(!feof(f2) fscanf(f2, %d, &y); (5) ; else fprintf(f3, (6) ); while(!feof(f1) (7) ; fprintf(f3, %dn, x); fclose(f1); fclose(f2); fclose(f3);C语言程序设计语言程序设计38#include#include#include void main( ) (7) ; int flag = 1; char ch; if(f1=fopen(“a.txt”,”r”) = =NULL) printf(“不能打开文件不能打开文件a.txt n”);exit(0); if(f2=fopen(“b.txt”,”w”) = =NULL) printf(“不能打开文件不能打开文件b.txt n”);exit(0);C语言程序设计语言程序设计39while( (8) ) if( (9)&ch =a&ch=z) fputc(ch-32,f2); else (10) ; if(! isalpha(ch) flag=1; else flag=0; fclose(f1);fclose(f2);