目前我们所编写的程序中,数据多是通过键盘输入,存放在变量、数组或链表中,但它们仅能临时存储数据,程序运行结束后数据就丢失了为了方便输入数据、保存数据,引入文件文件通常长期存放在外部存储设备中,如硬盘、磁盘、光盘、U盘、磁带等。在我们需要时,从这些存储设备上读取文件数据本讲内容:(1)文件的概念(2)文件的类别(3)文件类型指针(4)文件的打开与关闭(5)文件的字符读写函数(6)文件的字符串读写函数第9讲文件(1)文件:指存储在外部介质上的数据的集合操作系统是以文件为单位对数据进行管理的。数据必须通过文件进行存储文件除了包括磁盘上存储的内容外,从操作系统的角度看,与主机相连的各种输入输出设备也是文件。例如:键盘是标准输入文件stdin显示器是标准输出文件stdout文件的概念文件建立在目录(文件夹)下,同一级目录里保存的文件不能同名文件的唯一标识是其存放路径+文件名例:文件getnum.c的路径是D:\home\Sunner\Secrets\getnum.c例:怎样区分两个main.c文件?D:\home\Sunner\Secrets\main.cD:\Backup\main.c文件的概念C语言把文件看作是一个以字节为基本单位的序列,即文件是由一个字节一个字节的数据顺序组成的根据数据的组织形式把文件分为两类:文本文件和二进制文件文本文件(也称ASCII文件)文本文件将任何数据看作字符串形式,每一个字节存放一个字符(ASCII码)。二进制文件数据按其在内存中的存储形式存放在文件中优点:字符型数据存、取方便缺点:数值型数据,需要ASCII码形式到二进制形式的转换优点:数值型数据存、取方便缺点:数值型数据不能直接输出字符形式文件的类别例:设有一整数2460:2460在文本文件中的存储形式:001100100011010000110110001100002460在二进制文件中的存储形式:2460=211+28+27+24+23+22字符’2’50字符’4’52字符’6’56字符’0’4800001001100111000000000000000000文件的类别定义文件类型指针变量格式:FILE*指针变量名;注意:1.只有通过文件指针变量才能访问相应的文件2.FILE必须大写文件的访问需要通过定义文件类型指针变量文件类型指针操作文件的步骤:1.定义文件指针变量,FILE*fp2.打开文件,fp=fopen(“文件名”,“r”)3.向文件写入数据或从文件读取数据fputc(ch,fp);ch=fgetc(fp);4.关闭文件,fclose(fp)变化多端文件类型指针voidSaveFile(){charch;FILE*fp;fp=fopen(letter.dat,w);for(ch='A';ch='Z';ch++)fputc(ch,fp);fclose(fp);}//定义一个文件指针变量//打开文件操作//判断文件打开是否成功//将字符ch写入到文件中//关闭文件if(fp==NULL){printf(Openingfileerror!\n);exit(0);}例:将字符’A’—’Z’写入文件letter.dat中保存起来文件类型指针fopen函数函数原型:FILE*fopen(char*filename,char*mode);函数的返回值是一个文件地址,赋给一个文件指针变量需要打开的文件名打开文件的方式(只读)让文件类型指针变量指向被打开的文件例:FILE*fp;fp=fopen(“file1.txt”,“r”);使用格式:文件类型指针变量=fopen(文件名,文件打开方式);文件的打开文件的打开与关闭打开文件时,因打开方式不对或其他原因,可能会使打开文件操作失败,这时fopen函数的返回值是NULL,所以在打开文件时通常需要判断一下打开操作是否成功if((fp=fopen(“file1.txt”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}说明:exit函数的作用是关闭所有文件,结束程序,注意:使用exit函数要包含头文件stdlib.h文件的打开文件的打开与关闭if((fp=fopen(“file1.txt”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}if((fp=fopen(“e:\\data\\file2.txt”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}文件的打开如果文件不在当前目录下,应写出文件的完整路径说明:在双引号中用2个斜杠表示1个斜杠如果文件在当前目录下,即.cpp源程序所在目录文件的打开与关闭(1)“r”与“rb”只读(2)“w”与“wb”只写文件的打开方式“r”只读打开一个文本文件,“rb”只读打开一个二进制文件以此方式打开文件,该文件必须已经在磁盘中存在“w”只写打开一个文本文件,“wb”只写打开一个二进制文件以此方式打开文件,如有同名文件(即文件已存在),则将原有文件删除并建立一个新文件;如没有同名文件(即文件不存在),则建立一个新文件文件的打开与关闭文件的打开方式(3)“a”与“ab”追加(4)“r+”与“rb+”读/写“a”追加打开一个文本文件,“ab”追加打开一个二进制文件以此方式打开文件,如文件已存在,则将当前读写位置位于文件末尾,可以追加数据;如文件不存在,则建立一个新文件“+”表示即能读又能写“r+”或“rb+”方式打开文件时,文件必须已经存在文件的打开与关闭(6)“a+”与“ab+”读/写文件的打开方式(5)“w+”与“wb+”读/写“w+”或“wb+”方式打开文件时,建立一个新文件(如文件已存在,则将原文件覆盖)“a+”或“ab+”方式打开文件时,如文件已存在,可在文件末尾追加数据;如文件不存在,则建立一个新文件文件的打开与关闭文件打开方式汇总表以读/写方式打开一个二进制文件“ab+”向二进制文件末尾追加数据“ab”以读/写方式建立一个新的二进制文件“wb+”以只写方式建立一个新的二进制文件“wb”以读/写方式打开一个二进制文件“rb+”以只读方式打开一个二进制文件“rb”以读/写方式打开一个文本文件“a+”向文本文件末尾追加数据“a”以读/写方式建立一个新的文本文件“w+”以只写方式建立一个新的文本文件“w”以读/写方式打开一个文本文件“r+”以只读方式打开一个文本文件“r”含义使用方式二进制文件文本文件文件的打开与关闭文件的关闭fclose函数的作用:将文件指针变量所指向的文件关闭fclose函数注:不论用什么方式打开文件,关闭文件的方法都一样函数原型:int*fclose(FILE*fp);函数的返回值是一个整数,关闭成功返回0,出错返回EOF文件的打开与关闭字符的写入函数函数原型:intfputc(intch,FILE*fp);函数功能:将字符ch写入fp所指向的文件中函数返回值:成功时返回该字符,失败时返回EOF说明:写入一个字符后,文件位置指针将自动指向下一个字节charch;FILE*fp;if((fp=fopen(“file1.txt”,“w”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}fputc(‘s’,fp);ch=‘t’;fputc(ch,fp);//将字符常量‘s’写入fp指向的文件file1中//将字符变量ch中存放的字符‘t’写入fp指向的文件file1中fputc函数文件的字符读写函数例:从键盘输入一行字符,写到文本文件string.txt中#includestdio.h#includestdlib.hvoidmain(){FILE*fp;charch;if((fp=fopen(string.txt,w))==NULL){printf(can'topenfile\n);exit(0);}do{ch=getchar();fputc(ch,fp);}while(ch!='\n');fclose(fp);}//从键盘输入一个字符//将ch中的字符写到文件中文件的字符读写函数字符的读取函数函数原型:intfgetc(FILE*fp);函数功能:从fp所指向的文件中读取一个字符,并将其返回函数返回值:成功时返回该字符,失败或文件结束时返回EOF说明:读取一个字符后,文件位置指针将自动指向下一个字节charch;FILE*fp;if((fp=fopen(“file1.txt”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}ch=fgetc(fp);printf(“%c\n”,ch);fgetc函数文件的字符读写函数voidmain(){FILE*fp_in,*fp_out;charch,infile[20],outfile[20];}例:将一个文本文件的内容复制到另一个文件中scanf(%s,infile);if((fp_in=fopen(infile,r))==NULL){printf(can'topenfile:%s,infile);exit(0);}scanf(%s,outfile);if((fp_out=fopen(outfile,w))==NULL){printf(can'topenfile:%s,outfile);exit(0);}while(){ch=fgetc(fp_in);fputc(ch,fp_out);}fclose(fp_in);fclose(fp_out);用字符数组名,不加双引号feof函数检查文件是否结束,结束返回非零值,否则返回零文件的字符读写函数!feof(fp_in)字符串读取函数函数原型:char*fgets(char*buf,intn,FILE*fp);函数功能:从fp所指向的文件中读取一个长度为(n-1)的字符串,并在其后自动加一个‘\0’,然后将其存放在起始地址为buf的空间内如果读入(n-1)个字符前遇到换行符或文件结束符,则结束读入函数返回值:成功时返回字符串的首地址,失败或文件结束时返回NULL说明:buf--字符数组名,n--字符个数,fp--文件指针变量fgets函数文件的字符串读写函数例:将文本文件中的内容显示到屏幕上FILE*fp;charstring[81],filename[20];while(fgets(string,81,fp)!=NULL)printf(%s,string);gets(filename);if((fp=fopen(filename,r))==NULL){printf(can'topenfile!\n);exit(0);}fclose(fp);文件的字符串读写函数字符串写入函数函数原型:intfputs(char*str,FILE*fp);函数功能:将str字符串写到fp所指向的文件中,但‘\0’不写入文件函数返回值:成功时返回0,出错时返回EOF说明:str—字符串常量或字符数组名或字符指针变量fp—文件指针变量fputs函数文件的字符串读写函数例:在文本文件string.txt末尾添加若干行字符FILE*fp;chars[81];当输入空行(即单独一个回车符)时结束向文件中输入一个换行符if((fp=fopen(string.txt,a))==NULL){printf(can'topenfile\n);exit(0);}while(strlen(gets(s))0){fputs(s,fp);fputc(‘\n’,fp);}fclose(fp);文件的字符串读写函数Assignment从键盘输入一个字符串,将其中的小写字母全部转化成大写字母,然后输出到‘test.txt’文件中。上机练习文件的打开、读写与关闭基本操作toupper():将ch字符转换成大写字母_strupr()