ProgramminginCLanguage第十一章文件C程序设计教学重点文件及文件类型指针概念文件的操作:打开、读写、关闭常用的文件系统函数C程序设计第十一章文件第11章11.1文件概述文件的定义存储在外部介质上的数据的集合。文件名称文件名[.扩展名]在C程序中的数据文件按存储格式分:以字符形式存储的文件称文本文件或ASCII码文件以二进制形式存放的文件称二进制文件第11章数据文件的存储格式例:数据12345678按二进制数存放:4个字节按字符存放:8个字节01011011110011010001010100000111'1''2''3''4''5''6''7''8'二进制文件文本文件00110001001100100011001100110100001101010011011000110111001110004950515253545556第11章11.1文件概述文本文件与二进制文件的区别文本文件阅读方便,直观,便于对字符逐个输入/出,但占存储空间多,花费转换时间;二进制文件由于一个字节并不对应一个字符,不能直接显示文件内容,但节省存储空间,不需转换。第11章程序数据区内存储器数据流向缓冲区外存储器文件标准设备文件键盘显示器输出输入写文件读文件第11章11.1文件概述FILE文件类型在stdio.h中定义了一个FILE结构体类型;该结构体中存放有关打开文件的信息(文件名、文件状态、数据缓冲区位置、文件读写的当前位置等)。文件类型指针文件的操作,都必须通过指向文件类型的指针变量来进行;即用户必须定义一个文件类型的指针。文件类型指针的定义FILE*文件结构体指针变量名;第11章11.1文件概述文件的操作打开文件:建立文件缓冲区、获取指向FILE类型结构体变量的指针。读写文件:通过文件类型指针,调用读写函数对文件进行读写操作。关闭文件:释放文件缓冲区,释放文件指针所指的FILE类型结构体变量。第11章打开文件fopen函数函数原型FILE*fopen(char*filename,char*mode)功能:打开名为filename的文件,函数的返回值为指向该文件的FILE结构体类型变量的首地址,打开文件失败则返回NULL。mode:打开文件的使用方式,用字符串表示,参见教材P.240表11.1例:以只读方式打开文本文件d:\vc\abc.txt。FILE*fp;fp=fopen(d:\\vc\\abc.txt,r);通常需要检查文件打开是否成功,以下是文件打开常用的程序段:if((fp=fopen(d:\\vc\\abc.txt,r))==NULL){printf(Openfileerror!\n);exit(0);}11.2文件的打开和关闭函数exit(0)的功能:终止程序头文件stdlib.h第11章11.2文件的打开和关闭关闭文件函数原型:intfclose(File*fp)功能:确保最后输出到文件缓冲区中的内容(无论是否已满),立即写入到对应的外存文件中;释放fp所指向的文件结构体和文件缓冲区。函数返回非0表示出错,返回0则表示文件已被正常关闭。例:FILE*fp;//打开当前目录下的文本文件abc.txtfp=fopen(abc.txt,r);……fclose(fp);第11章11.3文件的读写C提供不同的读写文件的函数:文本文件的读写fgetcfputc读写一个字符fgetsfputs读写一个字符串fscanffprintf格式化读写二进制文件的读写freadfwrite读写一个“内存块”第11章11.3文件的读写—fgetc函数字符输入函数fgetc函数原型:intfgetc(FILE*fp)功能:从fp所指的文本文件的当前读写位置读入一个字符。函数返回该字符的ASCII值,若到文件结束标志则返回EOF(-1)。从文件读入一个字符后,文件读写位置向后移动一个字节。常用方法:c=fgetc(fp);//c为字符型变量例:FILE*fp;charch;fp=fopen(d:\\vc\\abc.txt,r);ch=fgetc(fp);putchar(ch);//从文件当前读写位置读取一个字符,输出到显示器。第11章11.3文件的读写对于文本文件,判断文件是否结束,可以采用以下方法:while((ch=fgetc(fp))!=EOF){……//读数据,处理}在stdio.h中定义EOF为-1例:FILE*fp;charch;fp=fopen(d:\\vc\\abc.txt,r);while((ch=fgetc(fp))!=EOF)putchar(ch);第11章11.3文件的读写—feof函数feof函数:判断是否读到文件末尾函数原型:intfeof(FILE*fp)功能:当读到文件末尾时返回非0值,否则返回0。使用方法:适用于文本文件或二进制文件while(!feof(fp)){……//读数据,处理}例:FILE*fp;charch;fp=fopen(d:\\vc\\abc.txt,r);while(!feof(fp)){ch=fgetc(fp);putchar(ch);}第11章11.3文件的读写—fputc函数字符输出函数fputc函数原型:intfputc(charch,FILE*fp)功能:在fp所指的文本文件的当前读写位置写入一个字符。写入字符成功函数返回该字符的ASCII值,否则返回值为EOF(-1)。向文件写入一个字符后,文件读写位置向后移动一个字节。常用方法:fputc(c,fp);//c为字符型变量例:FILE*fp;charch;fp=fopen(d:\\vc\\abc.txt,w);ch=getchar();fputc(ch,fp);putchar(ch);//将ch写到文件的当前读写位置,并输出ch到显示器第11章fgetc与fputc举例①例:输入一个字符串,假定每行字符不超过80个。要求将该字符串写入文本文件a.dat中,然后再将文件中的内容输出到显示器。#includestdio.h#includestdlib.hvoidmain(){FILE*fp;chars[80],ch;inti;if((fp=fopen(a.dat,w))==NULL){printf(openfileerror!\n);exit(0);}gets(s);for(i=0;s[i]!='\0';i++)fputc(s[i],fp);fclose(fp);if((fp=fopen(a.dat,r))==NULL){printf(openfileerror!\n);exit(0);}while(!feof(fp)){ch=fgetc(fp);putchar(ch);}fclose(fp);}第11章fgetc与fputc举例②例:统计当前目录下文本文件a.dat中’a’字符的个数。#includestdio.h#includestdlib.hvoidmain(){FILE*fp;charch;intn=0;//统计个数if((fp=fopen(a.dat,r))==NULL){printf(openfileerror!\n);exit(0);}while((ch=fgetc(fp))!=EOF)//从文件中读取数据if(ch=='a')n++;fclose(fp);printf(n=%d\n,n);}while(!feof(fp)){ch=fgetc(fp);if(ch=='a')n++;}第11章11.3文件的读写—fscanf函数格式化输入函数函数原型:intfscanf(FILE*fp,char*format,地址列表)功能:按照格式控制字符串format所给定的输入格式,从fp所指向的文件当前读写位置读取的数据(从文件读取),并按地址列表存入指定的存储单元。从文件读取数据后,文件读写位置向后作相应的移动。例:FILE*fp;charch;fp=fopen(“d:\\vc\\abc.txt”,”r”);while(!feof(fp)){fscanf(fp,“%c”,&ch);putchar(ch);}第11章11.3文件的读写—fprintf函数格式化输出函数函数原型:intfprintf(FILE*fp,char*format,输出表)功能:按照格式控制字符串format所给定的输出格式,将输出表中各表达式值输出(写)到fp所指向文件的当前读写位置。向文件输出数据后,文件读写位置向后作相应的移动。例:FILE*fp;charch;fp=fopen(“d:\\vc\\abc.txt”,”w”);ch=getchar();fprintf(fp,“%c”,ch);putchar(ch);}第11章fscanf与fprintf举例①例1:从键盘输入40个学生的英语成绩,存放在新建的文本文件s.dat中。#includestdio.h#includestdlib.hvoidmain(){FILE*fp;inti,score;if((fp=fopen(s.dat,w))==NULL){printf(openfileerror!\n);exit(0);}for(i=1;i=40;i++){scanf(%d,&score);//从键盘输入fprintf(fp,%6d,score);//写入文件}fclose(fp);}第11章fscanf与fprintf举例②例2:从文本文件s.dat中读取学生的英语成绩(不超过100个),将成绩输出到显示器。#includestdio.h#includestdlib.hvoidmain(){FILE*fp;inti=0,score[100],n;if((fp=fopen(s.dat,r))==NULL){printf(openfileerror!\n);exit(0);}while(!feof(fp))fscanf(fp,%d,&score[i++]);//从文件读取数据fclose(fp);n=i;for(i=0;in;i++)printf(%6d,score[i]);}第11章本章作业编写程序:在当前目录下新建一个文本文件1.dat,从键盘输入10个整数,将些整数写入文件1.dat中。编写函数voidsort(int*x,intn),对一维数组x的n个数组元素按升序进行排序。编写主函数,从第一题的文本文件1.dat中读取数据,存放到一维数组a中,调用sort函数对数组a进行排序,并将排序后的各数组元素写入文本文件2.dat中。题1提示:1.定义数组a[10]及文件指针;2.从键盘输入数组a;3.打开文件1.dat4.for(i=0;i10;i++)将a[i]写入文件;5.关闭文件题2提示:主函数:1.定义数组a[10]及文件指针;2.打开文件1.dat;3.for(i=0;!feof(fp);i++)从文件中读取数据至a[i];4.关闭文件5.调用sort函数,对数组a排序;6.打开文件1.dat7.for(i=0;i10;i++)将a[i]写入文件;8.关闭文件sort函数:对数组元素x[0]—x[n-1]排序