1、语言程序设计C语言程序设计语言程序设计 信息与电气工程学院信息与电气工程学院20122012年年5 5月月CDIO.flash8net_2454.swf语言程序设计第八章第八章 文件操作文件操作工资管理系统之工资管理系统之数据永久记录数据永久记录 任务一任务一 学习目标学习目标 任务二任务二 了解文件了解文件 任务三任务三 了解文件的存储形式了解文件的存储形式 任务四任务四 了解对文件的操作了解对文件的操作 任务五任务五 打开文件打开文件fopen 任务六任务六 将职工工资数据写入文件将职工工资数据写入文件fwrite 函数的应用函数的应用语言程序设计 任务七任务七 从文件中读取职工工资数据从
2、文件中读取职工工资数据fread 函数的应用函数的应用 任务八任务八 关闭文件关闭文件fclose 函数的应用函数的应用 任务九任务九 更多的读写文件函数更多的读写文件函数 任务十任务十 了解文件数据的定位了解文件数据的定位 任务十一任务十一 知识扩展知识扩展 任务十二任务十二 精选案例精选案例 任务十三任务十三 本章要点汇总本章要点汇总 任务十四任务十四 实力检验实力检验语言程序设计1、本章主要任务就是解决数据的保存问题;2、数据的保存涉及文件的概念和操作;3、如何通过语言代码加以实现,需要深入学习文件的相关知识。语言程序设计1、“文件”:是指存放在外存储器上的各类信息的有序集合;2、按照不
3、同的标准,可以将文件进行分类;3、文件操作主要指对文件的建立、删除、读取、写入等操作。语言程序设计1、根据文件内数据组织形式的不同,可以将数据文件分为文本文件和二进制文件;2、文本文件记录的是字符信息,其中每一个字节存放一个 ASCII 代码,表示一个字符,如字母、数字、标点符号等。而二进制文件则是将数据按其在内存中的原始存储形式,直接输出到磁盘上,即文件的内容就是内存的直接映像;3、二进制文件居多。语言程序设计打开文件、读文件、写文件、关闭文件等语言程序设计ANSI C 规定了标准输入/输出函数库stdio.h中的 fopen 函数,用来实现打开文件的操作。其调用方式通常为: FILE *f
4、p; /*fp为文件指针变量标识符,由程序设计人员命名*/ fp=fopen(文件名,文件打开方式); 例如:打开工资管理系统中的职工工资数据文件gz.dat FILE *file; file=fopen(gz.dat,rb“); /*rb表示以只读方式打开二进制文件 gz.dat */FILE是一个结构,每个被打开使用的文件都会在内存中开辟一个区域,用于存放该文件的有关信息,诸如文件的名字、状态和当前位置等此处是需要打开的文件,以字符串形式表达,如果包含路径,应该如何表达呢?此处是打开文件的方式,具体请看教材P243语言程序设计r只读以读方式打开文本文件w只写以写方式创建文本文件,原文件存在
5、则删除后创建,文件不存在则直接创建a追加以追加方式打开文本文件,只允许在文件尾写入rb只读以读方式打开二进制文件wb只写以写方式创建二进制文件,原文件存在则删除后创建,文件不存在则直接创建ab追加以追加方式打开二进制文件,只允许在文件尾写入r+读写以读写方式打开文本文件,可读可写w+ 读写以读写方式创建文本文件,原文件存在则删除后创建,文件不存在则直接创建a+读写以读写方式打开文本文件,允许读,亦允许在文件末写入rb+ 读写以读写方式打开二进制文件,允许读,亦允许写语言程序设计 if(file=fopen(gz.dat,wb)!=NULL)/*判断打开成功*/ /*成功后的处理*/ fwrit
6、e(&zggz0,sizeof(zggz0),n+1,file); /*所有记录一次写入文件*/ fclose(file); /*关闭文件*/ printf(记录保存完毕! n); 或者: if(file=fopen(gz.dat,wb)=NULL) /*判断打开失败*/ printf(文件打开失败); 语言程序设计能够将数据写入文件的能够将数据写入文件的 C 语言标准函数有语言标准函数有很多,在实际的软件开发过程中,较常用的是很多,在实际的软件开发过程中,较常用的是函数函数。 size_t fwrite(const void *buf,size_t size,size_t count,FIL
7、E *stream) 从内存地址 bufbuf 处开始,将countcount 个 sizesize 大小的数据写入文件streamstream中。成功写入的实际数据块个数。stdio.h 相关函数参见任务七中的fread()函数。语言程序设计以下是以下是“职工工资管理系统职工工资管理系统”中的一个自定义函数中的一个自定义函数void write( ) FILE *file; /*声明文件指针*/ if(n=-1) /*职工人数为0时*/ printf(没有数据可存! 按任意键返回主菜单。n); getch( ); return; if(file=fopen(gz.dat,wb)!=NULL)
8、 /*以二进制方式打开职工工资数据文件,并判断是否成功*/ fwrite(&zggz0,sizeof(zggz0),n+1,file); /*所有记录一次写入文件*/语言程序设计 能够从文件中读取数据的能够从文件中读取数据的 C 语言标准函数语言标准函数同样有很多,在实际的软件开发过程中,较常同样有很多,在实际的软件开发过程中,较常用的是用的是 函数函数。size_t fread(void *buf, size_t size, size_t count, FILE *stream)从从 streamstream 指示的文件中,读取指示的文件中,读取 countcount 个个 sizesize
9、 大小的数据,放入内大小的数据,放入内存地址存地址 bufbuf处。处。 成功读取的数据块个数。成功读取的数据块个数。 stdio.h 语言程序设计以下是以下是 “工资管理系统工资管理系统” 中的一个自定义函数,中的一个自定义函数, 其功其功能是实现将职工工资信息从文件能是实现将职工工资信息从文件gz.dat读入内存,并存放于结读入内存,并存放于结构数组构数组 zggz100中。中。void read( ) FILE *file; /*声明文件指针*/ if(file=fopen(gz.dat,rb)=NULL)/*以二进制方式打开职工工资数据文件,并判断是否失败*/ printf(nnt职工
10、工资数据文件无法打开,或为空! ); printf(nnt按任意键进入主菜单); getch( ); return; else /*文件打开成功时*/ 语言程序设计程序对指定文件进行读写操作完成后,必须“关闭”该文件。尤其是写操作,因为,在缓冲文件系统中,写操作的直接目标是内存缓冲区,而不是磁盘,“关闭”文件就是将内存缓冲区中的内容写入到磁盘文件中,所以,只有执行了“关闭”操作,才能保证文件内容的完整性。语言程序设计fclosefclose( )( )函数说明函数说明int fclose(FILE *stream)关闭文件指针。关闭前清除所有与关闭文件指针。关闭前清除所有与streamstre
11、am相关联的缓冲区,释放系统分相关联的缓冲区,释放系统分配的缓冲区。配的缓冲区。成功时返回成功时返回0 0;失败时返回;失败时返回EOFEOFstdio.h EOFEOF意为意为end-of-fileend-of-file,是,是C C内部宏定义:内部宏定义: #define EOF -1#define EOF -1 对文本文件读操作时,经常以此判断是否文对文本文件读操作时,经常以此判断是否文件读取完毕。件读取完毕。语言程序设计int fgetc(FILE *stream)从指针streamstream指定的文件中读取一个字符成功时返回所读字符;当遇到文件结束符EOFEOF时,返回-1stdi
12、o.h相关函数参见第三章任务六中的getchargetchar( )( )函数语言程序设计int fputc(int ch,FILE *stream)将字符ch写入到指针stream指定的文件中成功时返回所写字符的ASCII码值;失败时返回EOFstdio.h相关函数参见第三章任务六中的putchar( )函数语言程序设计【案例【案例8-1】从一个文本文件中读取一个字符,然后写入到另一个文本文件中。分析分析在“C:”目录下创建一个文本文件text.txttext.txt,内容如图8-1所示;以读方式打开上述文本文件,并读取一个字符;以写方式创建文件C:text1.txt,再将字符写入其中,同时
13、在屏幕上进行显示。语言程序设计#include int main( )FILE *fp; /*定义文件指针*/char ch;/*记录从c:text.txt中读取的、向c:text1.txt写入的一个字符*/if(fp=fopen(c:text.txt,r)!=NULL) ch=fgetc(fp);/*打开文件成功后,读取一个字符赋值给ch*/else return 0;/*打开文件失败时,退出程序并返回0*/fclose(fp);/*关闭文件*/if(fp=fopen(c:text1.txt,w)!=NULL) fputc(ch,fp);/*打开成功后,将ch中记录的字符写入文件*/语言程序
14、设计咋整呢?咋整呢?语言程序设计char *fgets(char *str,int num,FILE *steam)从streamstream中读取num-1num-1个字符,放入strstr所指的字符数组中,并将NULLNULL放入到最后一个字符后。成功时返回成功时返回strstr;失败时返回空指针。;失败时返回空指针。stdio.hstr可以是数组名;当读了num-1个字符后或遇到换行符时,函数停止读过程。语言程序设计int fputs(const char *str,FILE *stream)将str所指的字符串内容写入指针stream指定的文件中,字符串结束标志NULL并不写入。成功时
15、返回0 0;失败时返回EOFEOF。stdio.h语言程序设计text.txttext.txttext2.txttext2.txt语言程序设计#include int main( )FILE *fp; /*定义文件指针*/char str255;/*记录从c:text.txt中读取的向c:text2.txt写入的一个字符串*/if(fp=fopen(c:text.txt,r)!=NULL)fgets(str,255,fp);/*打开文件成功后读取一个字符串存入str*/else return 0; /*打开文件失败时退出程序*/fclose(fp); /*关闭文件*/if(fp=fopen(c
16、:text2.txt,w)!=NULL)fputs(str,fp); /*打开文件成功后写入str中记录的字符串*/else return 0; /*打开文件失败时退出程序*/语言程序设计int fscanf(FILE *stream,const char *format ,address-list)从文件指针streamstream指向的文件中读取数据,并按照格式化字符串要求的格式,将数据存入address-listaddress-list地址列表中 (参照scanfscanf( )( )函数)。成功则返回address-listaddress-list个数;失败则返回EOFEOF。stdi
17、o.h在使用%s读取字符串时,结束位置必须是空格、制表符或回车。类似函数参见第三章任务六中的scanf ( )函数。语言程序设计int fprintf(FILE *stream,const char *format ,argument-list)按指定格式,向streamstream指向的文件写入数据(参照printfprintf( )( )函数)。成功则返回写入的字节数,失败则返回EOFEOF。类似函数参见第三章任务六中的printfprintf ( )( )函数。stdio.h语言程序设计fscanffscanffprintffprintfC:text.txtC:text.txtC:tex
18、t3.txtC:text3.txt语言程序设计#include main( )FILE *fp;char str255;if(fp=fopen(C:text.txt ,r)!=NULL)fscanf(fp,%s,str); /*此处使用了fscanf( )函数读取字符串*/else return 0;fclose(fp);if(fp=fopen(C:text3.txt ,w)!=NULL)fprintf(fp,%s,str);/*此处使用了fprintf( )函数写入字符串*/else return 0;puts(str);语言程序设计实际应用中的数据文件,往往都会在文件的开始位置有一部分特殊
19、的数据,以记录该文件的一些属性,如开发公司名称、版本号、数据结构等,这个特殊的数据区域,称之为文件头。因此,需要读取的数据往往并不在开始位置。所以,掌握rewind( )和fseek( )函数的应用显得尤为重要。语言程序设计void rewind(FILE *stream);将streamstream指向的文件内部数据位置指针重新移动到开始位置,同时清除与streamstream相关的文件结束和错误标志。无。stdio.h语言程序设计语言程序设计#include main( )FILE *fin,*fout;/*分别声明用于读取和写入的两个文件指针*/fin=fopen(C:text.txt,
20、r); /*以只读方式打开C:text.txt,返回的指针赋给fin指针*/fout=fopen(C:text4.txt,w);/*以只写方式打开C:text4.txt,返回的指针赋给fout指针*/while(!feof(fin)putchar(fgetc(fin);/*通过循环从fin中读取字符并显示于屏幕*/rewind(fin); /*将上面循环执行后自动移动到文件尾的内部指针移动到起始位置*/while(!feof(fin)fputc(fgetc(fin),fout); /*通过循环从fin中读取字符并写入fout中*/fclose(fin); /*关闭文件*/语言程序设计int f
21、seek(FILE *stream, long offset, int origin);根据offset和origin的值,移动stream指向的文件内部数据位置指针。origin确定基准位置,offset是相对origin基准位置的偏移字节数,其值若是正数,表示指针向后移动,若是负数,表示指针向前移动。成功时返回0;失败时返回非0。stdio.horiginorigin有三个基准位置,且有三个对应的宏定义,如表语言程序设计origin取值对应的宏含义0SEEK_SET文件开始位置1SEEK_CUR 文件当前位置2SEEK_END 文件结束位置语言程序设计语言程序设计#include #inc
22、lude main( )FILE *fp;int i;/*声明记录读取字符个数的变量*/if(fp=fopen(C:text.txt,r)!=NULL)/*如果打开文件C:text.txt成功,执行以下复合语句*/fseek(fp,6,SEEK_SET);/*将指针从文件起始位置向后移动6个字节*/i=10;while(i-!=0)putchar(fgetc(fp);/*通过循环从fp文件当前位置读取10个字符并显示于屏幕*/putchar(n);/*将屏幕光标移动到新行行首*/fseek(fp,-8,SEEK_END); /*将指针从文件结束位语言程序设计语言程序设计long ftell(F
23、ILE *stream)返回stream指定的文件中内部数据指针位置。成功时返回当前内部指针位置,以字节数表示;失败时返回-1L。stdio.h返回fp所指文件内部数据指针当前位置long m;if(m=ftell(fp)!=-1L)printf(m=%ldn,m);else exit(0);语言程序设计int feof(FILE *stream)检查文件内部数据指针位置,以确定是否已经到达stream指定的文件末尾。处在文件尾时返回非0值;否则返回0。stdio.h该函数既可用于判断二进制文件,又可用于以判断文本文件。检测文件内部数据指针是否到达文件尾File *fp;if(feof(fp)
24、 printf(文件内部数据指针已经到达文件尾文件内部数据指针已经到达文件尾n);else exit(0);语言程序设计语言程序设计#include main( )FILE *ftxt,*fpho;char ch;if(ftxt=fopen(c:text.txt,rb)=NULL)printf(c:text.txt文件无法打开!n);return;if(fpho=fopen(c:photo.jpg,ab)=NULL)printf(c:text.txt文件无法打开!n);return;语言程序设计语言程序设计#include main( )FILE *fpho;char ch;if(fpho=f
25、open(c:photo.jpg,rb)=NULL)printf(c:photo.jpg件无法打开!n);return;while(!feof(fpho)/*文件内部指针未到文件尾,执行循环体*/ch=fgetc(fpho); /*从ftxt所指文件中读取一个字节信息*/语言程序设计语言程序设计#include #include void format( ); /*参数为“/?”时的帮助提示*/int copyf(char *txt,char *pho);/*实现将机密信息追加到目标文件的功能*/main(int argc,char *argv)int flag;if(argc=1)forma
26、t( );else if(argc=2)&strcmp(argv1,/?)=0)format( );else if(argc=3)flag=copyf(argv1,argv2);语言程序设计语言程序设计#include void echo(char *fname); /*用于显示fname所指文件内容*/main( )FILE *fp;int i;char fname=c:data.dat;if(fp=fopen(fname,w)=NULL)/*以二进制写方式打开fname文件*/printf(%s文件无法打开!n,fname);return 0;for(i=-100;i=100;i+)语言程
27、序设计1.数据文件有文本文件和二进制文件之分。文本文件记录的是字符的ASCII编码,而二进制文件记录的是数据在内存的存储状态。2.文件操作的基本步骤是:打开文件、移动文件内部数据指针、读取或写入数据、关闭文件。语言程序设计3.对文件操作的函数汇总:打开文件:FILE *fopen(const char *fname,const char *mode)写入数据:size_t fwrite(const void *buf,size_t size,size_t count,FILE *stream)读取数据:size_t fread(void *buf,size_t size,size_t coun
28、t,FILE *stream)关闭文件:int fclose(FILE *stream)读一字符:int fgetc(FILE *stream)写一字符:int fputc(int ch,FILE *stream)语言程序设计读字符串:char *fgets(char *str,int num,FILE *steam)写字符串:int fputs(const char *str,FILE *stream)格式读取数据:int fscanf(FILE *stream,const char *format ,address-list)格式写入数据:int fprintf(FILE *stream,const char *format ,argument-list)指针移回文件起始位置:int rewind(FILE *stream);指针按指定方式移动:int fseek(FILE *stream, long offset, int origin);语言程序设计返回数据指针当前位置:long ftell(FILE *stream)测试文件指针当前是否指向文件尾:int feof(FILE *stream)语言程序设计1-6题 选择题 考察基础知识7-10题阅读程序分析结果或填空考察知识应用能力重点:实验实训作业:2、3、7、8