C语言第7章_文件及应用

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

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

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

资源描述

第七章文件及应用兰州理工大学第七章文件及应用7.1C语言文件的概念7.2文件操作7.3非缓冲文件系统7.1C语言文件的概念文件是一组存储在外部设备上的数据的集合。每个文件都有一个文件名,操作系统以树状的目录(或称文件夹)管理文件。使用文件可以:大量、永久地保存信息;便于数据共享;文件的分类:按文件的逻辑结构:记录文件:由定长或不定长的记录组成;流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件(磁盘文件):存储介质文件(磁盘、磁带、光盘等);设备文件:非存储介质(键盘、显示器、打印机等)。按数据的组织形式:文本(ASCII码)文件:每个字节存放一个字符的ASCII码;二进制文件:数据按其在内存中的存储形式原样存放。UNIXC标准定义了两套I/O操作方法:缓冲文件系统(bufferedfilesystem),也可称为格式化的(formatted)或高级(highlevel)文件系统;非缓冲(unbuffered)文件系统,也可称非格式化的(unformatted)文件系统,只存在于UNIX标准中。ANSIC标准仅定义了缓冲文件系统。本章集中讨论ANSIC文件系统。7.1.1ANSIC的I/O和UNIXC的I/ODisk内存BufferC语言为实现设备无关性(各种不同的设备和磁盘文件等同),提供了称为流的抽象。流是由数据字节序列组成的。每一个C流与一个文件相连。流的模式共有两类:文本流(text);二进制(binary)(比特)流。通常把显示器定义为标准输出文件,使用printf,putchar函数对其输出。键盘通常被指定标准的输入文件,使用scanf,getchar函数输入。7.1.2流和文件文件还可以分为:随机存取文件,如磁盘文件;顺序存取文件,如键盘。支持随机存取的文件,打开文件时也初始化文件位置指示(FilePositionIndicator),将其置为文件开始处,随着对文件的读写再对其增量或减量,确保访问的正确推进。7.1.3C语言文件与文件相联的每个流都有一个FILE类型的控制结构,通常称为文件指针。在stdio.h中定义,用户绝对不能修改。7.1.3C语言文件typedefstruct{intlevel;/*缓冲区“满”或“空”的程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读取字符*/intbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据缓冲区位置*/unsignedchar*curp;/*文件定位指针*/unsignedistemp;/*临时文件指示器*/shorttoken;/*用于有效性检查*/}FILE;7.2文件操作文件的操作包括了几个基本步骤:1)定义文件结构体类型指针;2)打开文件;3)文件的读/写(追加)操作;4)关闭文件。声明一个文件结构体类型指针的形式是:FILE*文件结构体指针名;例如:FILE*fp1,*fp2;声明了两个指向文件的文件指针变量。7.2.1定义文件结构体类型的指针文件的一般处理过程7.2.2用于文件操作的函数7.2.2用于文件操作的函数UNIXI/O函数(非缓冲文件系统)大多没有前缀f。用于文件操作的函数原型声明在stdio.h中。系统定义宏EOF为整数-1,当读到文件尾时的返回该值。1.文件的打开与关闭函数1)打开文件FILE*fopen(char*filename,char*mode);例:FILE*fp=fopen(test,rw);filename是包含的路径文件名mode是打开方式,见表:返回值为指向此文件的指针,以后使用。如果打开失败,返回值为NULL。7.2.2用于文件操作的函数1.文件的打开与关闭函数2)关闭文件函数fclose()关闭由fopen()函数打开的流。fclose()函数把遗留在缓冲区的数据写入文件,实施操作系统级的关闭操作。同时释放与流联系的文件控制块。7.2.2用于文件操作的函数2.文件的读写函数1)字符读写函数:intfputc(intch,FILE*fp);intfgetc(FILE*fp);2)串读写函数intfputs(constchar*str,FILE*fp);char*fgets(char*str,intlength,FILE*fp);7.2.2用于文件操作的函数【例7.6】统计文本文件中的字符个数。7.2.2用于文件操作的函数/*功能:统计一个文本文件中字符的个数*//*说明:文件名从命令行输入*/#includestdio.hmain(intargc,char*argv[]){FILE*fp;intcount=0;if((fp=fopen(argv[1],r))==NULL){printf(can'topenfile%s.,argv[1]);exit(1);//文件打开失败,退出}//文件成功打开,从文件中读取字符while(fgetc(fp)!=EOF)//按字符读文件并对读入字符数进行count++;//统计,直到遇到文件结束符为止fclose(fp);printf(file\%s\contains%dcharacters.\n,argv[1],count);}【例7.8】将键盘输入的串写入文件test中。7.2.2用于文件操作的函数/*功能:建立一个文本文件*//*说明:使用函数gets()*/#includestdio.h#includestring.hvoidmain(void){charstr[80];FILE*fp;if((fp=fopen(c:\\test,w))==NULL){printf(不能打开文件!\n);exit(1);}do{printf(输入一个字串(空回车结束):\n);gets(str);strcat(str,\n);/*加上一个新行符'\n'*/fputs(str,fp);/*写出到文件中*/}while(*str!='\n');/*当输入空串时结束*/}2.文件的读写函数3)格式读写函数fprintf()和fscanf()intfprintf(FILE*fp,constchar*format,……);char*fscanf(FILE*fp,constchar*format,……);4)块读写函数fwrite()和fread()intfwrite(void*buf,size_tsize,size_tcount,FILE*fp);intfread(void*buf,size_tsize,size_tcount,FILE*fp);7.2.2用于文件操作的函数【例7.11】建立一个学生通讯录的数据库文件。7.2.2用于文件操作的函数/*功能:建立一个学生通讯录的数据库文件*//*说明:使用格式输出函数fprintf()*/#includestdio.hmain(){FILE*fp;charch;structmail{charname[9];charsex[3];charbirth[12];charlocal[5];charphone[8];charpostcode[7];charaddr[20];}st;if((fp=fopen(mail,w))==NULL){printf(fileopenfailed!!!\n);exit(0);}fprintf(fp,%10.8s%6.4s%12.10s%6.4s%9.7s%8.6s%13.10s\n,“姓名”,“性别,出生日期,区号,电话,邮政编码,通讯地址);fprintf(fp,---------------------------------------------------------------------\n);while(1){printf(姓名:);scanf(%s,st.name);printf(性别(男or女):);scanf(%s,st.sex);printf(出生日期(yyyy-mm-dd):);scanf(%s,st.birth);printf(区号xxxx:);scanf(%s,st.local);printf(电话xxxxxxx:);scanf(%s,st.phone);printf(邮政编码:);scanf(%s,st.postcode);printf(通讯地址:);scanf(%s,st.addr);/*按特定的格式写出数据到文件*/fprintf(fp,%10.8s%6.4s%12.10s%6.4s%9.7s%8.6s%s\n,st.name,st.sex,st.birth,st.local,st.phone,st.postcode,st.addr);printf(StrikeEoretoendenter?\n);ch=getch();if(ch=='e'||ch=='E')break;};fclose(fp);}【例7.15】如例7.11,用块写函数来建立学生通讯录。7.2.2用于文件操作的函数/*功能:建立一个学生通讯录的数据库文件*//*说明:使用块写入函数fwrite()*/#includestdio.hmain(){FILE*fp;charch;structmail{charname[9];charsex[3];charbirth[12];charlocal[5];charphone[8];charpostcode[9];charaddr[20];}st;if((fp=fopen(mail,wb))==NULL){printf(fileopenfailed!!!\n);exit(0);}while(1){printf(姓名:);scanf(%s,st.name);printf(性别(男or女):);scanf(%s,st.sex);printf(出生日期(yyyy-mm-dd):);scanf(%s,st.birth);printf(区号xxxx:);scanf(%s,st.local);printf(电话xxxxxxx:);scanf(%s,st.phone);printf(邮政编码:);scanf(%s,st.postcode);printf(通讯地址:);scanf(%s,st.addr);/*按特定的格式写出数据到文件*/if(fwrite(&st,sizeof(structmail),1,fp)!=1)printf(Writeerror!);printf(StrikeEoretoendenter?\n);ch=getch();if(ch=='e'||ch=='E')break;};fclose(fp);}【例7.17】用块读函数来读出并显示学生通讯录。7.2.2用于文件操作的函数/*功能:读出并显示学生通讯录的数据库文件*//*说明:使用块输出函数fread()*/#includestdio.hmain(){FILE*fp;charch;structmail{charname[9];charsex[3];charbirth[12];charlocal[5];charphone[8];charpostcode[9];charaddr[20];}st;if((fp=fopen(mail,rb))==NULL){printf(fileopenfailed!!!\n);exit(0);}while(!feof(fp)){if(fread(&st,sizeof(structmail),1,fp)!=1)break;printf(%10.8s%4.2s%12.10s%6.4s%9.7s%8.6s%13.10s\n,name,sex,birthday,local,phone,postcode,address);printf(----------------------------------------------------------\n);printf(%10

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

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

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

×
保存成功