版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章
文件2第十章文件教学目标:
了解文件的概念熟悉文件的操作函数
学会使用各种函数操作文件内容教学重点与难点:
学会使用各种函数操作文件内容
310.1文件的概述如果需要长期保存程序运行所需的数据,或程序运行产生的结果,就必须以文件形式存储到外部存储介质上。通过使用文件操作的相关函数,可以实现数据的保存,以便下次运行程序时,可以从文件中读取所需要的内容。1.文件的概念文件是根据特定目的收集在一起并存储在外部介质上的一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。其中,外部介质是指硬盘、光盘、U盘等。计算机的操作系统是以文件为单位对数据信息进行管理的,这些数据可以是文本、图片、音频、视频等。410.1文件的概述2.文件分类从用户的角度看,文件可分为普通文件和设备文件两种。(1) 普通文件:是指驻留在磁盘或其他外部介质上的一个有序数据集。如源程序文件、目标文件、可执行文件、word文档等。(2) 设备文件:是指与主机相连的各种外部设备,如显示器、打印机、鼠标、键盘等。在操作系统中,可以把外部设备也看作是一个文件来管理,把它们的输入和输出等同于对磁盘文件的读和写。510.1文件的概述从文件编码的方式来看,文件可分为ASCII码文件和二进制文件两种。(1) ASCII码文件:文本文件也称为ASCII码文件。这种文件在保存的时候,每个字符对应一个字节,用于存放对应的ASCII码。例如,整数5678的存储形式如下:ASCII码:00110101001101100011011100111000十进制码:5678共占用4个字节,即每个数字字符占一个字节。610.1文件的概述(2) 二进制文件:不是保存ASCII码,而是把内存中的数据按其在内存中存储的二进制编码方式来保存文件内容。例如,整数5678的二进制形式为:0001011000101110只占2个字节。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)控制,因此,也把这种文件称为“流式文件”。710.1文件的概述3.文件指针在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。文件指针是一个指向文件有关信息的指针,这些信息包括文件名、文件状态及文件当前位置等。它们保存在一个结构体变量中,该结构体类型是由系统定义的,规定为FILE型。在stdio.h文件中声明如下:typedefstruct{shortlevel;/*level表示文件缓冲区的状态是满还是空*/unsignedflags;/*flags为文件状态标志*/charfd;/*fd为文件描述符*/unsignedcharhold;/*hold表示如果没有文件缓冲区则不能读取字符*/shortbsize;/*bsize为文件缓冲区的大小*/unsignedchar*buffer;/*指针buffer指向数据缓冲区的位置*/unsignedchar*curp;/*指针curp指向文件的当前活动指针*/unsignedistemp;/*istemp表示文件是否为临时文件*/shorttoken;/*token用于文件合法性检查*/}FILE;8用户可以通过上面定义的FILE类型来定义变量。语法的一般格式为:FILE*指针变量标识符;例如:FILE*pfile;其中,pfile是指向FILE结构的指针变量,通过pfile即可找到存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,从而实现对文件的各种操作。10.1文件的概述910.2文件的打开与关闭C语言对文件的操作主要是对流式文件的打开、关闭、读、写及定位等操作。1.打开文件打开文件使用fopen函数,其调用的一般格式为:文件指针名=fopen(文件名,使用文件方式);说明:(1)文件指针名:必须声明为FILE类型的指针变量。(2)文件名:被打开的文件的名字,包含路径的文件名字符串。(3)使用文件方式:打开文件的方式,如只读或只写等等。使用文件的方式共有12种,如表10.1所示。1010.2文件的打开与关闭文件使用方式含义“rt”只读打开一个文本文件,只允许读数据“wt”只写打开或建立一个文本文件,只允许写数据“at”追加打开一个文本文件,并在文件末尾写数据“rb”只读打开一个二进制文件,只允许读数据“wb”只写打开或建立一个二进制文件,只允许写数据“ab”追加打开一个二进制文件,并在文件末尾写数据“rt+”读写打开一个文本文件,允许读和写“wt+”读写打开或建立一个文本文件,允许读和写“at+”读写打开一个文本文件,允许读,或在文件末追加数据“rb+”读写打开一个二进制文件,允许读和写“wb+”读写打开或建立一个二进制文件,允许读和写“ab+”读写打开一个二进制文件,允许读,或在文件末追加数据表10.1文件使用方式及含义1110.2文件的打开与关闭关于文件使用方式的几点说明:(1)文件使用方式由“r”、“w”、“a”、“t”、“b”、“+”6个字符拼成,各字符具体含义如下:r(read):读;w(write):写;a(append):追加;t(text):文本文件,可省略不写;b(banary):二进制文件;+:读和写。(2)当使用方式为“r”时,该文件必须已经存在,否则报错,并且只能从该文件读出数据。(3)当使用方式为“w”时,只能向该文件写入数据。(4)如果向一个已存在的文件追加新的内容,只能使用“a”方式打开文件,并且该文件必须存在,否则将会出错。1210.2文件的打开与关闭(5)如果打开一个文件时出错,fopen函数将返回一个空指针值NULL。(6)把一个文本文件读入内存时,要将ASCII码转换成二进制码;把文件以文本方式写入磁盘时,也要将二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。(7)标准输入文件(键盘)、标准输出文件(显示器)和标准出错输出(出错信息)是由系统打开的,可直接使用。1310.2文件的打开与关闭2.关闭打开的文件文件使用完毕后,应关闭文件,以避免文件的数据丢失等错误。关闭文件使用fclose函数,其调用的一般格式为:fclose(文件指针);例如:fclose(fp);文件关闭成功时,fclose函数的返回值为0。如返回非零值,则表示有错误发生。【例10.1】实现文件的打开与关闭功能。程序如下:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*file=NULL;file=fopen("D:\\Data\\Test.txt","wt+");/*打开文件*/if(file!=NULL)14{ puts("打开文件成功\n"); }else{ puts("打开文件失败\n");}fclose(file);/*关闭文件*/getchar();return0;}程序分析:运行程序后,如果“D:\\Data\\Test.txt”文件存在,那么打开文件成功,文件指针不为NULL,显示提示信息“打开文件成功”,并关闭文件。否则,显示“打开文件失败”的提示信息。10.2文件的打开与关闭1510.3顺序文件的读写文件读写是对文件最常用的操作,在C语言中,提供了多种文件读写的函数来实现文件读写。文件读写函数分为两类:顺序读写函数和随机读写函数。顺序读写文件是对文件的访问次序按照数据在文件中的实际存放顺序进行,不允许跳跃式读取或插入到任意位置写入数据。顺序读写文件的函数分为四类,具体如下:(1)字符读写函数:fgetc和fputc。(2)字符串读写函数:fgets和fputs。(3)数据块读写函数:fread和fwrite。(4)格式化读写函数:fscanf和fprintf。1610.3.1字符读写函数fgetc和fputc字符读写函数是以字符(字节)为单位的读写函数。每次可从文件读出或向文件写入一个字符。1.读字符函数fgetcfgetc函数的功能是从指定的文件中读取一个字符,函数调用的一般格式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);表示从打开的文件fp中读取一个字符并赋给字符变量ch。1710.3.1字符读写函数fgetc和fputc【例10.2】使用读字符函数,从文件中读取一个一个的字符,并将读取的字符保存在字符数组中,然后输出字符数组的内容。
程序如下:#include
<stdio.h>#include
<stdlib.h>int
main(
void
){
FILE
*file;
char
buffer[81];int
i;
char
ch;
file=fopen("D:\\Data\\Test.txt","r");/*打开文件*/1810.3.1字符读写函数fgetc和fputcif(
file
==
NULL
)
{
puts(“打开文件失败\n”);
}
ch
=
fgetc(
file
);
/*从文件中读取字符*/
/*如果读取的字符不到80个,或者没有读到文件的末尾处,
就不停的一个字符一个字符的读取*/
for(
i=0;
(i<=80
)
&&
(
feof(
file
)
==
0
);
i++
)
{
buffer[i]
=
ch;
ch
=
fgetc(
file
);
}
19buffer[i]
=
'\0';
/*添加字符串结束符*/
printf(
"%s\n",
buffer
);
/*输出保存到数组中的内容*/
fclose(
file
);
getchar();
return
0;
}10.3.1字符读写函数fgetc和fputc程序分析:运行程序后,打开文件“Test.txt”,从文件中依次读取字符,直到读到文件末尾,或者已经读取了80个字符,然后输出该字符串。例如,若文件中的内容为:Thisisatestfile,则输出的字符串为:Thisisatestfile。2010.3.1字符读写函数fgetc和fputc2.写字符函数fputcfputc函数的功能是将一个字符写入指定的文件中,函数调用的一般格式为:fputc(字符量,文件指针);
其中,待写入的字符量可以是字符常量或变量。例如:fputc('c',fp);表示将字符c写入fp所指向的文件。【例10.3】实现从键盘输入字符,将输入的字符保存到文件中,直到输入回车键为止。程序如下:#include
<stdio.h>
#include
<stdlib.h>
int
main(
void
)
{
FILE
*file;
char
buffer[81];int
i;
char
ch;
file
=
fopen(
"D:\\Data\\Test.txt",
"wt"
);
10.3.1字符读写函数fgetc和fputc2210.3.1字符读写函数fgetc和fputcif(
file
==
NULL
)
{
puts("打开文件失败\n");
}
/*输入一个字符,如果输入的不是回车,则将输入的字符保存到文件*/
ch
=
getchar();
while(ch
!=
'\n')
{
fputc(ch,file);
ch
=
getchar();
}
fclose(
file
);
return
0;
}
程序分析:
运行程序后,输入一串字符,按回车键后,
会将输入的字符串保存到“D:\\Data\\Test.txt”
文件中。2310.3.2字符串读写函数fgets和fputs字符串读写函数和字符读写函数类似,字符读写函数,每次操作一个字符,而字符串读写函数是每次操作一串字符。1.读字符串函数fgetsfgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的一般格式为:fgets(字符数组名,n,文件指针);其中,“字符数组”用来存放文件中读取的字符串;“n”是一个正整数,指定要读取的字符串的长度,实际上最多只能从文件中读取n-1个字符。例如:fgets(str,n,fp);表示从fp所指向的文件中读出n-1个字符放入字符数组str中。2410.3.2字符串读写函数fgets和fputs【例10.4】实现从文件中读取一串字符,并显示字符串的内容。程序如下:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*file;charline[100];file=fopen("D:\\Data\\Test.txt","r");/*打开文件*/if(file==NULL){puts("打开文件失败\n");}/*从文件中读取一串字符,读取的长度为100*/if(fgets(line,100,file)==NULL)2510.3.2字符串读写函数fgets和fputs{ puts("读取字符串失败\n");}else{ printf("读取的字符串为:%s",line);}fclose(file);getchar();return0;}程序分析:运行程序后,打开文件“Test.txt”,从中读取100个字符,并将读取的内容输出。如果文件中字符个数不足100,则读取文件中的所有内容。例如,若文件内容是:Thisisatestfile,则读取的字符串为:Thisisatestfile。2610.3.2字符串读写函数fgets和fputs2.写字符串函数fputsfputs函数的功能是将字符串写入到指定的文件中,函数调用的一般格式为:fputs(字符串,文件指针);其中,字符串可以是字符串常量,也可以是字符数组名或字符指针变量。例如:fputs("abc",fp);表示把字符串“abc”写入fp所指向的文件中。如果写入成功,函数返回值为0;如果写入失败,返回非0值。【例10.5】实现将一个字符串写到文件的末尾,如果需要将文件追加到已有文件的末尾,打开方式为"at+"。程序如下:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*file;charline[100];file=fopen("D:\\Data\\Test.txt","at+");/*打开文件*/10.3.2字符串读写函数fgets和fputs2810.3.2字符串读写函数fgets和fputsif(file==NULL){ puts("打开文件失败\n");}/*将字符串写入到文件的末尾*/fputs("写入字符串到文件中\n",file);fclose(file);getchar();return0;}程序分析:运行程序后,会把字符串“写入字符串到文件中”添加到“D:\\Data\\Test.txt”文件的末尾。2910.3.3数据块读写函数fread和fwrite有时需要一次读写一组数据,即以数据块为存放单位,例如数组或结构体数据。C语言提供了数据块读写函数fread和fwrite,可以一次读写大量数据。1.数据块读函数freadfread函数的功能是从文件指针指定的文件中读取指定长度的数据块,函数调用的一般格式为:fread(buffer,size,count,fp);说明:(1)buffer:是数据块的指针。对于fread函数,它用来存放输入数据的首地址;对于fwrite函数,它用来存放输出数据的首地址。(2)size:表示数据块的字节数。(3)count:指定每读/写一次,输入或输出数据块的个数。(4)fp:文件型指针。3010.3.3数据块读写函数fread和fwrite2.数据块写函数fwritefwrite函数的功能是向文件中写入一块数据,函数调用的一般格式为:fwrite(buffer,size,count,fp);其中,buffer用来存放输出数据的首地址;count是要写入的数据块块数。【例10.6】打开一个文件,向文件中写入一组数据,并关闭文件。然后,再打开此文件,从文件中读取其中的数据。程序如下:#include<stdio.h>intmain(void){FILE*file;charlist[30];31inti,numread,numwritten;file=fopen("D:\\Data\\Test.txt","wt");/*打开文件写入数据*/if(file!=NULL){for(i=0;i<25;i++) {list[i]=(char)('z'-i); }/*写数据到文件中*/numwritten=fwrite(list,sizeof(char),25,file); printf("写了:%d项\n",numwritten);fclose(file);}
10.3.3数据块读写函数fread和fwrite32else{printf("打开文件失败\n");}/*打开文件读取数据*/file=fopen("D:\\Data\\Test.txt","rt");if(file!=NULL){/*读取字符*/numread=fread(list,sizeof(char),25,file);printf("读取的字字符数:%d\n",numread);printf("读取的内容为:%.25s\n",list);fclose(file);}
10.3.3数据块读写函数fread和fwrite33else{printf("打开文件失败\n");}getchar();}10.3.3数据块读写函数fread和fwrite程序分析:运行程序后,打开文件“Test.txt”,循环写入字符到一个字符数组中,使用写字符串函数,把字符数组中的一组数据写入到文件中,并关闭文件。接着,再打开此文件,使用读字符串函数,把文件中的内容读取出来。3410.3.4格式化读写函数和fscanf和fprintf格式化读写函数也能实现文件的读写操作,与前面介绍的读写函数的区别在于格式化读写函数实现了按照一定的格式来读写文件的内容。1.格式化读函数fscanffscanf函数的功能是从指定的文件中读取指定格式的数据,函数调用的一般格式为:fscanf(文件指针,格式字符串,输入表列);其中,格式字符串表示读取数据的格式;输入表列中包含待读取的常量、变量或字符串。例如:fscanf(fp,"%d%s",&a,name);表示从文件指针指向的文件中,按照格式字符串所规定的格式读取数据。3510.3.4格式化读写函数和fscanf和fprintf2.格式化写函数fprintffprintf函数的功能将格式化的数据写入到指定的文件中,函数调用的一般格式为:fprintf(文件指针,格式字符串,输出表列);例如:fprintf(fp,"%d%c",a,ch);表示按照格式字符串所规定的格式,写入数据到文件指针指向的文件中。3610.3.4格式化读写函数和fscanf和fprintf【例10.7】实现格式化写入数据到文件,然后格式化读取文件的内容,并显示出来。程序如下:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*file;longl;floatfp;chars[81];charc;file=fopen("D:\\Data\\Test.txt","w+");/*打开文件*/if(file==NULL)3710.3.4格式化读写函数和fscanf和fprintf{ puts("打开文件失败\n");}/*格式化写文件*/fprintf(file,"%s%ld%f%c","a-string",65000,3.14159,'x');fseek(file,0L,SEEK_SET);/*定位文件指针到文件的开始位置,fseek为文件内部指针定位函数,可实现文件内部指针的移动*//*格式化读文件的内容*/fscanf(file,"%s",s);fscanf(file,"%ld",&l);fscanf(file,"%f",&fp);fscanf(file,"%c",&c);/*显示读出的内容*/printf("%s\n",s);printf("%ld\n",l);3810.3.4格式化读写函数和fscanf和fprintfprintf("%f\n",fp);printf("%c\n",c);fclose(file);getchar();return0;}程序分析:运行程序后,会写入字符串“a-string650003.141590x”到文件中。然后,重新定位文件位置指针到文件开始处,格式化读取文件的内容,并显示出来。10.4随机文件的读写39前面介绍的顺序文件的读写操作,在读写文件的过程中,文件位置指针会自动向后移动,依次从文件头读/写至文件尾。但在实际应用中,读/写完一个数据之后,并不一定要访问下一个数据,而可能会访问其他位置的数据,这就是文件随机访问。在C语言中,通过rewind、fseek和ftell函数可以实现文件的随机读写功能。1.重置文件位置指针函数rewindrewind函数的功能是将文件的位置指针移到文件首,该函数无返回值。函数调用的一般格式为:rewind(文件指针);例如:rewind(fp);其中,fp是文件指针,指向所操作的文件。4010.4随机文件的读写2.移动文件位置指针函数fseekfseek函数的功能是将文件的位置指针指向指定位置,函数调用的一般格式为:fseek(文件指针,位移量,起始点);其中,文件指针指向当前操作的文件;位移量为文件位置指针移动读写位置的偏移量;起始点表示文件位置指针的起始位置,起始点的值有3个,文件头、文件当前位置和文件尾,具体如下:(1)SEEK_SET:对应的数值为0,表示文件位置指针从文件头进行偏移。(2)SEEK_CUR:对应的数值为1,表示文件位置指针从文件当前位置进行偏移。(3)SEEK_END:对应的数值为2,表示文件位置指针从文件末尾进行偏移。413.获取文件位置指针当前值函数ftellftell函数的功能是获取文件位置指针的当前位置,函数调用的一般格式为:ftell(文件指针);例如:ftell(fp);ftell函数调用成功后,返回文件位置指针的当前位置,如果调用时出现错误,则返回长整型-1L。【例10.7】通过使用fseek函数实现文件内容的随机读取。10.4随机文件的读写程序如下:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*file;42charline[81];intresult;file=fopen("D:\\Data\\Test.txt","w+");if(file==NULL){ puts("打开文件失败\n");}fprintf(file,"%s","fseek实现文件内部位置指针的定位");/*移动位置到第二个字符的位置*/fseek(file,1,SEEK_SET);/*在新的位置读取字符串*/fgets(line,80,file);/*输出读取的字符串*/10.4随机文件的读写43printf("读取的内容:%s",line);fclose(file);getchar();return0;}程序分析:运行程序后,会向文件中写入字符串“fseek实现文件内部位置指针的定位”。然后,通过fseek函数移动文件位置指针到第二个字符的位置,读取文件的内容,并显示读取的结果为“seek实现文件内部位置指针的定位”。10.4随机文件的读写10.5文件检测44对文件进行读写操作的过程中,经常会因为一些原因,产生各种错误。因此,可以增加一些错误检测方法,进行一些必要的错误处理。C语言提供了feof、ferror和clearerr函数用来检测文件操作过程中出现的错误。1.feof函数feof函数的功能是检测文件位置指针是否到达文件末尾位置,函数调用的一般格式为:feof(文件指针);例如:feof(fp);如果文件指针处于文件末尾,返回值为1;否则返回值为0。452.ferror函数ferror函数的功能是检测文件在使用输入输出函数(如fread、fwrite等)进行读写时,是否有错误发生。函数调用的一般格式为:ferror(文件指针);如果检测没有错误,返回值为0;否则返回值为1。在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度纺织品ODM定制与合作合同
- 2024年建筑工程材料供需协议
- 2024三方合作经营协议合同
- 2024年度环保型涂料生产与销售合同
- 2024年城市基础设施合作合同
- 2024年办公桌租赁协议
- 2024年度体育赛事赞助与推广合同
- 2024年度智慧校园建设与运营合同
- 2024家居装饰墙地砖采购协议
- 2024年建筑安装安全协议
- 【公开课】《农业专题复习》【课件】
- 第7课《大雁归来》课件(共15张ppt) 部编版语文八年级下册
- 培训的方式和方法课件
- 三年级下册口算天天100题(A4打印版)
- 三基选择题(东南大学出版社)
- 2021年大唐集团招聘笔试试题及答案
- DBJ53/T-39-2020 云南省民用建筑节能设计标准
- 2022版义务教育数学课程标准解读课件PPT模板
- 实验五 PCR扩增课件
- 马拉松运动医疗支援培训课件
- 中医药宣传手册
评论
0/150
提交评论