C语言程序设计第10章文件处理.ppt
第10章 文 件 处 理学习目标1了解文件的基本概念;2理解文件的基本应用;3掌握利用文件管理函数进行文件的打开、读写及关闭等基本操作方法。10.1 10.1 文件的基本概念文件的基本概念文 件ASCII 文件(text文件)二进制文件C对文件的处理方法缓冲文件系统非缓冲文件系统例:整数10000,在内存中占两个字节,输出到磁盘上若以ASCII形式占5个字节:00110001 00110000 00110011 00110000 00110000 若以二进制形式占2个字节:0010011100010000C文件是一个字节流或二进制流。旧的C版本(如Unix系统下使用的C)有两种对文件的处理方法:一种叫“缓冲文件系统”,一种叫“非缓冲文件系统”。缓冲文件系统:系统自动为正在使用的文件在内存开辟缓冲区。非缓冲文件系统:由程序为文件设置缓冲区。缓冲区文件系统读写文件操作示意图缓冲区文件系统读写文件操作示意图程序数据区输出文件缓冲区外存输入文件缓冲区10.2 10.2 文件类型指针文件类型指针 通过文件指针就可对它所指的文件进行各种操作。说明文件指针的一般形式为:FILE*指针变量名;FILE*fp;10.3 10.3 文件的基本操作文件的基本操作10.3.1 10.3.1 文件的打开文件的打开 在打开一个文件时,通知给编译系统以下三个信息:需要打开的文件名,即准备访问的文件的名字;使用文件的方式(读还是写等);让哪一个指针变量指向被打开的文件。打开文件操作由fopen函数来完成。fopen函数的一般调用形式为:文件指针名=fopen(“文件名”,“使用文件方式”);如:FILE*fp;fp=fopen(file1,r);文件使用方式含 义“r”(只读)“w”(只写)“a”(追加)“r+”(读写)“w+”(读写)“a+”(读写)打开用于只读打开用于写打开用于在文本尾写入,文件不存在时则建立打开一个已存在的文件,用于读和写(更新)建立一个新文件,用于写打开用于在文本尾写入,文件不存在则建立(更新)说明:说明:(1)在打开一个文件时,如果出错,fopen函数将返回一个空指针值NULL。常用下面的程序段打开文件:if(fp=fopen(file1,r)=NULL)printf(cannot open this file!n);exit(0);(2)把文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码。而对二进制文件的读写不存在这种转换。(3)运行一个C程序时,系统会自动打开三个文件:标准输入文件、标准输出文件、标准出错输出。通常情况下,stdin与终端键盘连接,stdout和stderr与终端屏幕连接。10.3.2 10.3.2 文件的关闭文件的关闭fclose函数,一般调用形式是:fclose(文件指针);如:fclose(fp);其中fp是要关闭文件的文件指针。10.3.3 10.3.3 文件的读写文件的读写一、字符读写函数 (fputc/fgetc或putc/getc)格式:fgetc(fp);fputc(ch,fp);#define putchar(c)fputc(c,stdout)#define getchar()fgetc(stdin)例:从键盘上输入一些字符,逐个将它们送到磁盘上去,直到输入一个“”为止。#include stdio.hmain()FILE*fp;char ch,filename10;scanf(%s,filename);if(fp=fopen(filename,w)=NULL)printf(cannot open file n);exit(0);ch=getchar();while(ch!=#)putc(ch,fp);putchar(ch);ch=getchar();fclose(fp);#include stdio.hmain()FILE*in,*out;char ch,infile10,outfile10;printf(Enter the infile name:n);scanf(%s,infile);printf(Enter the outfile name: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)putc(getc(in),out);fclose(in);fclose(out);#include stdio.hmain(argc,argv)int argc;char*argv;FILE*in,*out;if(argc!=3)printf(You forgot to enter a filenamen);exit(0);例:修改上例,使之在执行可执行文件时输入两个文件名。if(in=fopen(argv1,r)=NULL)printf(cannot open infilen);exit(0);if(out=fopen(argv2,w)=NULL)printf(cannot open outfilen);exit(0);while(!feof(in)fputc(fgetc(in),out);fclose(in);fclose(out);二、字符串读二、字符串读/写函数写函数读字符串函数的一般调用形式为:fgets(字符数组名,n,文件指针);写字符串函数fputs的一般调用形式为:fputs(字符串,文件指针);例:从c1.txt文件中读入一个含10个字符的字符串。#include void main()FILE*fp;char str11;if(fp=fopen(c1.txt,r)=NULL)printf(nCannot open file strike any key exit!);exit(0);fgets(str,11,fp);printf(n%sn,str);fclose(fp);例:在例10.2建立的文件c2.txt中追加一个字符串。#include void main()FILE*fp;char ch,st20;if(fp=fopen(c2.txt,a+)=NULL)printf(Cannot open file strike any key exit!);exit(0);printf(input a string:n);scanf(%s,st);fputs(st,fp);fclose(fp);三、数据块读三、数据块读/写函数写函数 数据块的读写可以分别由函数fread和fwrite来完成。fread函数调用的一般形式为:fread(buffer,size,count,fp);fwrite函数的一般调用形式为:fwrite(buffer,size,count,fp);说明:(1)fread和fwrite用来一次从(向)文件读(写)size*count字节。(2)fread和fwrite如果调用成功,则返回count的值,即输入或输出数据块的完整个数。(3)fread和fwrite一般用于二进制文件的输入输出,因为它们是按数据块的长度来处理输入输出的。例:从键盘输入4个学生的有关数据,然后把它们转存到以“stu_list”命名的磁盘文件中。#include#define SIZE 4struct student_type char name10;int num;int age;char addr15;stud SIZE;void save()FILE*fp;int i;if(fp=fopen(stu_list,wb)=NULL)printf(can not open filen);return;for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1)/*将一个长度为29字节的数据块送到“stu_list”文件中*/printf(file write errorn);fclose(fp);void main()int i;for(i=0;iSIZE;i+)scanf(%s%d%d%s,studi.name,&studi.num,&studi.age,studi.addr);save();例:编写print函数,将例10-5生成的磁盘文件stu_list中的数据输出到显示器上。void print(char*filename)FILE*fp;int i;if(fp=fopen(filename,rb)=NULL)printf(can not open filen);return;for(i=0;i2)。编程要求:(1)源程序存于MYF1.C文件中。(2)程序运行的结果存于MYF1.OUT文件中。(3)数据文件的打开、关闭和使用均要用C语言的文件管理语句来实现。(4)在结果文件中,要求每行输出四个数。#include void main()FILE*fp;long int a20=0,1,1;int i;if(fp=fopen(myf1.out,w)=NULL)printf(Can not open the file myf1.out!n);exit(1);for(i=3;i20;i+)ai=ai-3+2*ai-2+ai-1;for(i=0;i20;i+)fprintf(fp,%12ld,ai);if(i+1)%4=0)fprintf(fp,n);fclose(fp);10.4 10.4 程序设计举例程序设计举例例:有两个磁盘文件a.txt和b.txt,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到新文件c.txt中。#include stdio.hvoid main()FILE*fp;int i,j,n,ni;char c160,t,ch;if(fp=fopen(a.txt,r)=NULL)printf(file a cannot be openedn);exit(0);for(i=0;(ch=fgetc(fp)!=EOF;i+)/*将a.txt的字符存入c数组中*/ci=ch;fclose(fp);ni=i;if(fp=fopen(b.txt,r)=NULL)printf(file b cannot be openedn);exit(0);for(i=ni;(ch=fgetc(fp)!=EOF;i+)/*将b.txt的字符存入c数组中*/ci=ch;fclose(fp);n=i;for(i=0;in-1;i+)/*对c数组排序*/for(j=i+1;jcj)t=ci;ci=cj;cj=t;fp=fopen(c.txt,w);for(i=0;in;i+)fputc(ci,fp);fclose(fp);例:有五个学生,每个学生有3门课的成绩,从stud.dat文件中读学生学号、姓名、三门课成绩,并计算每个学生的平均成绩,将原有的数据和计算出的平均成绩存放在磁盘文件“stud1”中。stud.dat文件中的数据如下:001 a 85 70 80002 b 90 80 85003 c 90 95 85004 d 60 70 80005 e 85 70 80#include stdio.hstruct student char num6;char name8;int score3;float avr;stu5;void main()int i,j,sum;FILE*fp;fp=fopen(stud.dat,rb);for(i=0;i5;i+)fscanf(fp,%s%s,stui.num,stui.name);sum=0;for(j=0;j3;j+)fscanf(fp,%d,&stui.scorej);sum+=stui.scorej;stui.avr=sum/3.0;fclose(fp);fp=fopen(stud1,wb);for(i=0;i5;i+)if(fwrite(&stui,sizeof(struct student),1,fp)!=1)printf(file write errorn);fclose(fp);