C语言程序设计请用PowerPoint2003播放第8章文件的输入和输出本章导读学习完本章以后,你将能够:了解FILE类型及文件指针掌握缓冲文件系统中文件操作一般步骤及特点教学目的掌握文件指针,掌握文件的打开和关闭,文件的读写和定位方法。掌握文件的出错检测文件指针文件的打开和关闭文件的读写和定位教学重点教学难点文件的读写和定位关键词文件指针;输入输出授课时量理论学时:28.1文件的概述8.2文件的打开与关闭8.3文件的顺序读取8.4文件的定位与随机读写8.5文件的出错检测本章主要内容如下:8.1C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位使用数据文件的目的1、数据文件的改动不引起程序的改动——程序与数据分离2、不同程序可以访问同一数据文件中的数据——数据共享3、能长期保存程序运行的中间数据或结果数据文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放如int型数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果文件处理方法缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:缓冲区指令区程序用户数据区磁盘非缓冲文件系统:文件类型指针文件结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构体描述FILE定义在stdio.h中typedefstruct{int_fd;//文件号int_cleft;//缓冲区中剩下的字符数int_mode;//文件操作方式char*_next;//文件当前读写位置char*_buff;//文件缓冲区位置}FILE;文件类型指针指针变量说明:FILE*fp;用法:文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件文件关闭后,它的文件结构体被释放文件名文件使用方式文件类型指针C程序操作系统磁盘8.2文件的打开与关闭C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件--文件读/写--关闭文件系统自动打开和关闭三个标准文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderr打开文件fopen函数原型:FILE*fopen(char*name,char*mode)功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL要打开的文件名使用文件方式例文件打开与测试FILE*fp;fp=fopen(“aa.c”,“w”);if(fp==NULL){printf(“Fileopenerror!\n”);exit(0);}例FILE*fp;fp=fopen(“c:\\fengyi\\bkc\\test.dat”,”r”);例FILE*fp;char*filename=“c:\\fengyi\\bkc\\test.dat”;fp=fopen(filename,”r”);“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为输入打开一个文本/二进制文件为输出打开或建立一个文本/二进制文件为读/写打开一个文本/二进制文件为读/写建立一个文本/二进制文件为读/写打开或建立一个文本/二进制文件向文本/二进制文件尾追加数据文件使用方式含义文件关闭fclose作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针函数原型:intfclose(FILE*fp)功能:关闭fp指向的文件返值:正常关闭为0;出错时,非0文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fclose不关闭文件可能会丢失数据8.3文件的顺序读取字符读写:fputc与fgetcfputc函数原型:intfputc(intc,FILE*fp)功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,为EOFfgetc函数原型:intfgetc(FILE*fp)功能:从fp指向的文件中读取一字节代码返值:正常,返回读到的代码值;读到文件尾或出错,为EOF文件I/O与终端I/O#defineputc(ch,fp)fputc(ch,fp)#definegetc(fp)fgetc(fp)#defineputchar(c)fputc(c,stdout)#definegetchar()fgetc(stdin)判断二进制文件是否结束while(!feof(fp)){c=fgetc(fp);……..}例文件拷贝例从键盘输入字符,逐个存到磁盘文件中,直到输入‘#“为止#includestdio.hmain(){FILE*fp;charch,*filename=“out.txt”;if((fp=fopen(filename,w))==NULL){printf(cannotopenfile\n);exit(0);}printf(Pleaseinputstring:);ch=getchar();while(ch!='#'){fputc(ch,fp);putchar(ch);ch=getchar();}fclose(fp);}例读文本文件内容,并显示#includestdio.hmain(){FILE*fp;charch,*filename=“out.txt”;if((fp=fopen(filename,”r))==NULL){printf(cannotopenfile\n);exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}判断文本文件是否结束feof函数原型:intfeof(FILE*fp)功能:判断文件是否结束返值:文件结束,返回真(非0);文件未结束,返回0main()#includestdio.h{FILE*in,*out;charch,infile[10],outfile[10];scanf(%s,infile);scanf(%s,outfile);if((in=fopen(infile,r))==NULL){printf(Cannotopeninfile.\n);exit(0);}if((out=fopen(outfile,w))==NULL){printf(Cannotopenoutfile.\n);exit(0);}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}字符串读写:fgets与fputs函数原型:fgets(char*s,intn,FILE*fp)fputs(char*s,FILE*fp)功能:从fp指向的文件读/写一个字符串返值:fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLfputs正常时返回写入的最后一个字符;出错为EOF例从键盘读入字符串存入文件,再从文件读回显示fgets从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束)fputs把s指向的字符串写入fp指向的文件#includestdio.hmain(){FILE*fp;charstring[81];if((fp=fopen(file.txt,w))==NULL){printf(cann'topenfile);exit(0);}while(strlen(gets(string))0){fputs(string,fp);fputs(\n,fp);}fclose(fp);if((fp=fopen(file.txt,r))==NULL){printf(cann'topenfile);exit(0);}while(fgets(string,81,fp)!=NULL)fputs(string,stdout);fclose(fp);}格式化读写:fprintf与fscanf函数原型:intfprintf(FILE*fp,constchar*format[,argument,…])intfscanf(FILE*fp,constchar*format[,address,…])功能:按格式对文件进行I/O操作返值:成功,返回I/O的个数;出错或文件尾,返回EOFfprintf(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例从键盘按格式输入数据存到磁盘文件中去#includestdio.hmain(){chars[80],c[80];inta,b;FILE*fp;if((fp=fopen(test,w))==NULL){puts(can'topenfile);exit();}fscanf(stdin,%s%d,s,&a);/*readfromkeaboard*/fprintf(fp,%s%d,s,a);/*writetofile*/fclose(fp);if((fp=fopen(test,r))==NULL){puts(can'topenfile);exit();}fscanf(fp,%s%d,c,&b);/*readfromfile*/fprintf(stdout,%s%d,c,b);/*printtoscreen*/fclose(fp);}数据块读写:fread与fwrite函数原型:size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp)size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp)功能:读/写数据块返值:成功,返回读/写的块数;出错或文件尾,返回0说明:typedefunsignedsize_t;buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针fread与fwrite一般用于二进制文件的输入/输出例floatf[2];FILE*fp;fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);for(i=0;i2;i++)fread(&f[i],4,1,fp);例structstudent{intnum;charname[20];charsex;intage;floatscore[3];}