第09章-文件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十三章文件在前面的程序中,是把数据保存到内存变量里,数据的处理完全由程序控制。当程序运行结束后,所有变量被释放。另外,一般程序都会有数据的输入/输出,如果输入/输出的数据量不大,则在程序运行时通过键盘输入可解决;当输入/输出量很大时,就不方便了。文件就是解决上述问题的有效办法。把程序中使用的大量数据,通过编辑工具事先存储在磁盘文件中,得以长期保存。当程序运行时就从这个数据文件中读入,从而实现数据一次输入多次使用。同样,当有大量数据输出时,可以将其输出到指定文件中,不受屏幕大小限制,且任何时候都可查看文件结果。一个程序的运行结果还可作为另外程序的输入。§9.1C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位使用数据文件的目的1、数据文件的改动不引起程序的改动——程序与数据分离2、不同程序可以访问同一数据文件中的数据——数据共享3、能长期保存程序运行的中间数据或结果数据文件分类按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放文件类型指针指针变量说明:FILE*fp;fp是一个指向FILE类型结构体的指针变量;从而fp通过该结构体变量中的文件信息能够访问该文件;用法:文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件文件关闭后,它的文件结构体被释放§9.3文件的打开与关闭C文件操作用库函数实现,包含在stdio.h文件使用方式:打开文件--文件读/写--关闭文件系统自动打开和关闭三个标准文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderr打开文件fopen函数调用:FILE*fpfp=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作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针函数调用:fclose(fp)功能:关闭文件指针fp所指向的文件返值:正常关闭为0;出错时,非0文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fclose不关闭文件可能会丢失数据§9.4文件的读写函数字符I/O函数:fputc与fgetcfputc函数调用:fputc(ch,fp)功能:把一字节代码ch写入fp指向的文件中返值:正常,返回ch;出错,为EOFfgetc函数调用:ch=fgetc(fp)功能:从文件指针fp所指向的文件中读取一个字节代码返值:正常,返回读到的代码值;读到文件尾或出错为EOF文件I/O与终端I/O#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,”r))==NULL){printf(cannotopenfile\n);exit(0);}while((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}feof函数原型:intfeof(FILE*fp)功能:判断文件是否结束返值:文件结束,返回真(非0);文件未结束,返回0#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);}将字符ch存入fp所指的文件中将字符ch显示的屏幕上获得一个字符存入ch中#includestdio.hmain(){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);}数据块I/O:fread与fwrite函数调用:fread(buffer,size,count,*fp)fwrite(buffer,size,count,*fp)功能:读/写数据块返值:成功时返回读/写的块数;出错或到文件尾返回0说明:buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针(对文件指针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];}stud[10];for(i=0;i10;i++)fread(&stud[i],sizeof(structstudent),1,fp);例从键盘输入4个学生数据,把他们转存到磁盘文件中去#includestdio.h#defineSIZE2structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){inti;for(i=0;iSIZE;i++)scanf(%s%d%d%s,stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save();display();}voidsave(){FILE*fp;inti;if((fp=fopen(d:\\fengyi\\exe\\stu_dat,wb))==NULL){printf(cannotopenfile\n);return;}for(i=0;iSIZE;i++)if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)printf(filewriteerror\n);fclose(fp);}voiddisplay(){FILE*fp;inti;if((fp=fopen(d:\\fengyi\\exe\\stu_dat,rb))==NULL){printf(cannotopenfile\n);return;}for(i=0;iSIZE;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf(%-10s%4d%4d%-15s\n,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);}格式化I/O:fprintf与fscanf函数调用:fprintf(fp,format[,argument,…])fscanf(fp,format[,address,…])功能:按格式对文件进行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字符串I/O:fgets与fputs函数调用:fgets(s,n,fp)fputs(s,fp)功能:从fp指向的文件读/写一个字符串返值:fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLfputs正常时返回写入的最后一个字符;出错为EOFfgets从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束)fputs把s指向的字符串写入fp指向的文件§9.5文件的定位几个概念文件位置指针-----指向当前读写位置的指针读写方式顺序读写:位置指针按字节位置顺序移动,叫~随机读写:位置指针按需要移动到任意位置,叫~rewind函数函数调用:rewind(fp)功能:重置文件位置指针到文件开头返值:无例对一个磁盘文件进行显示和复制两次操作#includestdio.hmain(){FILE*fp1,*fp2;fp1=fopen(d:\\fengyi\\bkc\\ch12_4.c,r);fp2=fopen(d:\\fengyi\\bkc\\ch12_41.c,w);while(!feof(fp1))putchar(fgetc(fp1));rewind(fp1);while(!feof(fp1))fputc(fgetc(fp1),fp2);fclose(fp1);fclose(fp2);}fseek函数函数调用:fseek(fp,offset,whence)功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值文件指针位移量(以起始点为基点,移动的字节数)0向后移动0向前移动起始点文件开始SEEK_SET0文件当前位置SEEK_CUR1文件末尾SEEK_END2例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);ftell函数函数调用:ftell(fp)功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L,例磁盘文件上有3个学生数据,要求读入第1,3学生数据并显示main(){inti;FILE*fp;if((fp=fopen(studat,

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功