您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 文件是存储在外部介质上的数据的集合
10、文件10.1概述•文件是存储在外部介质上的数据的集合,由操作系统来管理。最常用的是磁盘文件。•从文件数据的组织形式可分为文本文件和二进制文件。源程序文件一般是文本文件数据文件可是文本文件,也可是二进制文件•C语言把文件都看作“字节流”文件,也称“流式文件”,对文件的读写是以字节为单位的。C语言中的文本文件的每个字节代表一个字符,存放的是该字符的ASCII码C语言中的二进制文件是把数据按其在内存中的存储形式照原样输出到磁盘上•C语言中对文件处理的方法可分为两种:缓冲文件系统系统自动为打开的文件开辟其各自的内存缓冲区,本章介绍的文本文件和二进制文件都属此种非缓冲文件系统系统不自动开辟内存缓冲区,而由用户根据需要在程序中设定10.2文件类型(FILE)指针•FILE类型处理一个文件须知它的各种信息,这些信息由系统将其构成一个结构体类型,取名FILE,谓之文件类型,其定义放在stdio.h头文件中。typedefstruct{int_fd;/*文件号*/int_cleft;/*缓冲区中剩下的字符*/int_mode;/*文件操作模式*/char*_nextc;/*文件当前位置*/char*_buff;}FILE;/*文件缓冲区位置*/•FILE类型指针包含了stdio.h头文件就可用FILE来定义文件类型的指针变量。如:FILE*fp;可以使fp指向某一文件的结构体变量,从而可通过该结构体变量中的各项信息来实现对该文件的操作。一个文件指针用来操作一个文件。如有n个文件,一般应定义n个文件类型指针变量来分别指向n个文件。10.3文件的打开和关闭1.文件打开函数fopen()FILE*fopen(char*filename,char*mode)调用时:•filename(文件名)为要打开文件的文件名(字符串),可写成:test.dat或定义过chars[]=test.dat;则写s;或定义过char*pc=test.dat;则写pc;或定义过#definefftest.dat;则写ff。•mode为文件使用方式或称打开方式,可以是:r—只读,为输入打开一个文本文件;w—只写,为输出打开一个文本文件;a—追加,向文本文件尾追加数据;rb—只读,为输入打开一个二进制文件;wb—只写,为输出打开一个二进制文件;ab—追加,向二进制文件尾追加数据;r+—读写,为读/写打开一个文本文件;w+—读写,为读/写建立一个新文本文件;a+—读写,为读/写(追加)打开一个文本文件。•打开文件常用如下语句:if((fp=fopen(file1.dat,r))==NULL){printf(cannotopenthisfile.\n);exit();}如果调用fopen()成功,返回一文件类型指针,否则返回一空指针。其中exit()是个进程控制库函数,其作用是关闭所有文件,终止程序运行。格式为:voidexit(intstatus)2.文件关闭函数fclose()格式:intfclose(FILE*fp)如果文件关闭成功,返回0,如检测到任何错误,则返回EOF(即-1,在头文件stdio.h中定义)。10.4文件的输入和输出10.4.1读写一个字符的函数—fgetc()和fputc()1.fgetc()函数格式:intfgetc(FILE*fp)功能:从一打开的文件中读一个字符,返回该字符。文件中有一个指向当前位置的指针自动后移一个字符。反复调用可一直读到文件结束。文件结束或出错时,返回EOF。C语言提供了一个检测文件结束函数:intfeof(FILE*fp)如果文件结束,返回非0值,否则返回0。【例7.1】设计程序读一个源程序文件,并在屏幕上显示。源程序文件名为:“c:\tc\hello.c”。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(c:\\tc\\hello.c,r))==NULL){printf(cannotopenthisfile.\n);exit();}ch=fgetc(fp);while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}fclose(fp);}其中:ch=fgetc(fp);while(feof(fp)==0){putchar(ch);ch=fgetc(fp);}也可写成:while(!feof(fp)){ch=fgetc(fp);putchar(ch);}或:while((ch=fgetc(fp))!=EOF)putchar(ch);2.fputc()函数格式:intfputc(charch,FILE*fp)功能:将字符ch写到fp指向的文件中去,成功,则返回该字符,否则返回EOF。【例7.2】将字符串“WelcomeFleshman!”写入c:\tc下名为“file1.dat”的磁盘文件中。#includestdio.hmain(){FILE*fp;charch;if((fp=fopen(c:\\tc\\file1.dat,w))==NULL){printf(cannotopenthisfile.\n);exit();}while((ch=getchar())!='\n')fputc(ch,fp);fclose(fp);}运行时输入:WelcomeFleshman!例:复制一个磁盘文件。#includestdio.hmain(){FILE*in,*out;charch,infile[10],outfile[10];printf(Entertheinfilename:\n;gets(infile);printf(Entertheoutfilename:\n;gets(outfile);if((in=fopen(infile,r))==NULL){printf(cannotopeninfile.\n);exit();}if((out=fopen(outfile,r))==NULL){printf(cannotopenoutfile.\n);exit();}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}10.4.2块读写函数—fread()和fwrite()格式:intfread(void*buf,intsize,intn,FILE*fp)intfwrite(void*buf,intsize,intn,FILE*fp)其中:void*buf:任何类型指向数据块(首址)的指针,intsize:要读写的数据块字节数,intn:要读写的数据块个数,FILE*fp:指向已打开的要读写文件的指针。读或写成功,返回读或写数据块个数功能:从fp指定的文件读取或写入长度为size的n个数据块,存到或取自buf所指向的内存区。例:建一函数,把上一章举例的学生数据链表的内容存入文件。voidsave(structstudent*head,FILE*fp){structstudent*p;for(p=head;p;p=p-next)fwrite(p,sizeof(*p),1,fp);}【例7.3】设职工数据为:工号、姓名、性别、年龄、工资,将6名职工的数据从键盘输入,然后送入磁盘文件worker1.rec中保存。再读此文件并输出这些数据,依次打印出来。#includestdio.h#defineSIZE6structworker_type{intnum,age;charname[10],sex;floatpay;}worker[SIZE];voidsave(){FILE*fp;inti;if((fp=fopen(worker1.rec,wb))==NULL){printf(Cannotopenfile.\n);exit();}for(i=0,iSIZE;i++){if(fwrite(&worker[i],sizeof(structworker_type),1,fp)!=1)printf(filewriteerror.\n);}fclose(fp);}main(){inti;FILE*fp;for(i=0;iSIZE;i++)scanf(%d%s%c%d%f,&worker[i].num,worker[i].name,&worker[i].sex,&worker[i].age,&worker[i].pay);save();printf(\nNoNameSexAgePay\n);fp=fopen(worker1.rec,rb);for(i=0;iSIZE;i++){fread(&worker[i],sizeof(structworker_type),1,fp);printf(%5d%-8s%-5c%-5d%6.2f\n,worker[i].num,worker[i].name,worker[i].sex,worker[i].age,worker[i].pay);}}输入和输出结果见p.154例(填空):以下程序把从键盘读入的10个整数以二进制方式写到一个名为bi.dat的新文件中。#includestdio.hFILE*fp;main(){inti,j;if((fp=fopen(______,wb))==NULL)exit(0);for(i=0;i10;i++){scanf(%d,&j);fwrite(&j,_________,1,__);}fclose(fp);}bi.datfpsizeof(int)10.4.3其他读写函数1.字符串读写函数•读字符串函数格式:char*fgets(char*string,intn,FILE*fp)功能:从fp指定的文件读取长度为n-1的字符串存入起始地址为string的内存空间,自动加结束标志'\0',共占n个字符,返回值为地址string。若在未读足n-1个字符前遇到换行符'\n'或文件结束就停止读取。若读到文件末尾或出错,则返回NULL值。•写字符串函数格式:intfputs(char*string,FILE*fp)其中string可以是字符串常量,字符数组名或字符指针。功能:将string指向的字符串写到fp指定的文件。但不输出字符串结束符。写成功,则返回所写的最后一个字符,否则返回EOF值。例(填空):从键盘上输入一个字符串,把其中的小写字母改成大写,输出到文件test.txt中,然后从该文件读出此字符串并显示。#includestdio.hmain(){FILE*fp;charstr[100];inti=0;gets(str);if((fp=fopen(test.txt,_____))==NULL){printf(Can'topenthisfile.\n);exit(0);}while(str[i]){if(str[i]='a'&&str[i]='z')str[i]=______;fputc(str[i],fp);i++;}fclose(fp);fp=fopen(test.txt,_____);fgets(str,100,fp);printf(%s\n,str);fclose(fp);}wrstr[i]-322.格式化读写函数•调用格式:fscanf(FILE*fp,格式说明,输入表列)fprintf(FILE*fp,格式说明,输出表列)•说明:这两个函数与scanf()和printf()相似,只是读写对象不同,前者是文件,后者是终端。这两个函数读写的是文本文件。【例7.5】有一封英文信,其文件名为:letter.txt。统计信中大写字母的个数,句子的总数。#includestdio.hmain(){FILE*fp;charc;intk,m;if((fp=fopen(letter.txt,r))==NULL){printf(cannotopenthisfile.\n);exit();}k=m=0;while(fscanf(fp,%c,&c)!=EOF){if(c='Z'&&c='A
本文标题:文件是存储在外部介质上的数据的集合
链接地址:https://www.777doc.com/doc-3382865 .html