您好,欢迎访问三七文档
1清华大学计算中心计算机程序设计基础第十章文件与数据存储•学习目标–掌握文件的基本概念–学会使用常用的文件操作函数进行文件读写–会使用文件存储、访问和管理数据2清华大学计算中心文件的基本概念•数据的保存与持久化–在程序结束时数据仍有效•文件的定义–一组相关信息的集合–存储于某种存储介质上–具有某种特定格式,其中的信息也具有相同的含义,需要用不同的方法存取•文件结构体与文件指针3清华大学计算中心计算机程序设计基础文件的类型•顺序文件与随机文件–顺序文件:只能顺序访问其中的信息•例:存储在磁带上的文件只能顺序访问–随机文件:可以随机访问文件的任一部分信息,可以指定读写位置•二进制文件与文本文件–文本文件:信息以字符形式存储,有分行信息,阅读目标为程序员与程序–二进制文件:文件以二进制码存储,无分行信息,阅读目标为程序4清华大学计算中心基本文件操作•文件打开与关闭操作–FILE*fopen(constchar*filename,constchar*mode);–intfclose(FILE*fp);•文件状态与缓冲区操作–intfeof(FILE*fp);–intfflush(FILE*fp);•文件指针操作–voidrewind(FILE*fp);–intfseek(FILE*fp,longoffset,intfromwhere);–longftell(FILE*fp);5清华大学计算中心基本文件操作•文件读写操作–intfprintf(FILE*fp,constchar*fmt,…);–intfscanf(FILE*fp,constchar*fmt,…);–intfgetc(FILE*fp);–char*fgets(char*str,intn,FILE*fp);–intputc(intch,FILE*fp);–charfputs(char*str,FILE*fp);–intfread(void*buf,intsize,intcount,FILE*fp);–intfwrite(void*buf,intsize,intcount,FILE*fp);6清华大学计算中心计算机程序设计基础文件打开操作•函数原型–FILE*fopen(constchar*filename,constchar*mode);•返回值–调用成功返回文件指针,失败返回NULL•函数参数–filename:文件名字符串,可以包含路径名–mode:文件打开模式7清华大学计算中心计算机程序设计基础文件打开模式•mode:文件打开模式–r:读,若文件不存在,返回NULL–w:写,若文件不存在,创建,若已存在,删除–a:追加,若文件不存在,创建,若已存在,添加到文件尾部–r+、w+:读写,若文件不存在,创建,若已存在,覆盖–a+:读与追加,若文件不存在创建,若已存在,覆盖–b:二进制格式•示例–“rb”:读模式打开二进制文件–“w+”:读写模式打开文本文件8清华大学计算中心计算机程序设计基础文件打开示例•文件打开应用#includestdio.h#includestdlib.hintmain(){FILE*fp;charfilename[40],mode[4];while(1){/*输入文件名和打开方式*/printf(“\nEnterafilename:“);gets(filename);/*输入文件名*/printf(“\nEnteramode(max3characters):“);gets(mode);/*输入打开方式*/…9清华大学计算中心计算机程序设计基础文件打开示例/*打开文件*/if((fp=fopen(filename,mode))!=NULL){printf(“\nSuccessfulopening%sinmode%s.\n“,filename,mode);/*输出成功信息*/fclose(fp);/*关闭文件*/}else{fprintf(stderr,“\nErroropeningfile%sinmode%s.\n“,filename,mode);/*输出不成功信息*/}/*询问是否结束*/puts(“Enterxtoexit,anyothertocontinue.“);if((getc(stdin))==‘x‘)break;elsecontinue;}}10清华大学计算中心计算机程序设计基础预定义的标准文件•标准文件:输入输出流–stdin:标准输入设备,一般为键盘–stdout:标准输出设备,一般为屏幕–stderr:标准错误输出设备,一般为屏幕–stdprn:标准打印设备,一般为缺省打印机–stdaux:标准11清华大学计算中心计算机程序设计基础文件关闭操作•函数原型–关闭单个文件:intfclose(FILE*fp);–关闭除标准文件之外的所有文件:intfcloseall();•文件缓冲区–外部块设备与内部数据流间的接口(中转站)–清理文件缓冲区:intfflush(FILE*fp);–清理所有文件的缓冲区:intfflushall();12清华大学计算中心计算机程序设计基础文件关闭示例•将磁盘文件中的信息复制到新文件中#includestdio.hvoidmain(){FILE*in,*out;charinname[12],outname[12];scanf(“%s”,inname);scanf(“%s”,outname);if((in=fopen(inname,“r”))==NULL){exit(0);}if((out=fopen(outname,“w”))==NULL){exit(0);}while(!feof(in)){fputc(fgetc(in),out);}fclose(in);fclose(out);};13清华大学计算中心计算机程序设计基础文件格式化输入输出操作•函数原型–格式化输出:intfprintf(FILE*fp,constchar*fmt,…);–格式化输入:intfscanf(FILE*fp,constchar*fmt,…);•说明–与标准格式化输入输出函数功能基本相同–差别:多了文件指针参数,输入源或输出目的均是文件,而不是标准设备•思考:fprintf(stdout,…);=printf(…);?14清华大学计算中心计算机程序设计基础文件格式化输出示例•将用户输入的5个浮点数写入文件#includestdio.h#includestdlib.hvoidclear_kb();intmain(){FILE*fp;floatdata[5];intcount;charfilename[20];puts(“Enter5floating-pointnumericalvalues.“);for(count=0;count5;count++)scanf(“%f“,&data[count]);clear_kb();/*清除键盘缓冲区*/…15清华大学计算中心(“Enteranameforthefile.“);gets(filename);if((fp=fopen(filename,“w“))==NULL){fprintf(stderr,“Erroropeningfile%s.“,filename);exit(1);}/*将数据写入文件和标准输出设备stdout*/for(count=0;count5;count++){fprintf(fp,“\ndata[%d]=%f“,count,data[count]);fprintf(stdout,“\ndata[%d]=%f“,count,data[count]);}fclose(fp);printf(“\n“);return0;}/*清空键盘缓冲区*/voidclear_kb(){charjunk[80];gets(junk);}16清华大学计算中心计算机程序设计基础文件格式化输入示例•从文件中读取5个浮点数#includestdio.h#includestdlib.hintmain(){floatf1,f2,f3,f4,f5;FILE*fp;if((fp=fopen(“INPUT.TXT“,“r“))==NULL){fprintf(stderr,“Erroropeningfile.\n“);exit(1);}fscanf(fp,“%f%f%f%f%f“,&f1,&f2,&f3,&f4,&f5);printf(“Thevaluesare%f,%f,%f,%f,and%f\n.“,f1,f2,f3,f4,f5);fclose(fp);//fopen中文件名如带路径,须写成return0;//c:\\input.txt用双\\表示\}17清华大学计算中心计算机程序设计基础文件字符输入输出操作•函数原型–字符输入:intfgetc(FILE*fp);–字符串输入:char*fgets(char*str,intn,FILE*fp);–字符输出:intputc(intch,FILE*fp);–字符串输出:charfputs(char*str,FILE*fp);•说明–与标准字符输入输出函数功能相同–差别:多了文件指针参数,源或目的均为文件18清华大学计算中心计算机程序设计基础文件直接输入输出操作•函数原型–直接输入:intfread(void*buf,intsize,intcount,FILE*fp);–直接输出:intfwrite(void*buf,intsize,intcount,FILE*fp);•说明–直接输入输出按块操作–fread():从文件fp中将count块大小为size的连续数据读入缓冲区buf–fwrite():将缓冲区buf中count块大小为size的连续数据写入文件fp19清华大学计算中心计算机程序设计基础文件直接输入输出示例•使用fread()与fwrite()进行直接文件访问#includestdio.h#includestdlib.h#defineSIZE20intmain(){intcount,array1[SIZE],array2[SIZE];FILE*fp;/*数组初始化*/for(count=0;countSIZE;count++)array1[count]=2*count;/*打开一个二进制文件准备写入数据*/if((fp=fopen(“direct.txt“,“wb“))==NULL){fprintf(stderr,“Erroropeningfile.“);exit(1);}…20清华大学计算中心
本文标题:程序设计基础10
链接地址:https://www.777doc.com/doc-3372347 .html