您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第十章 文件(人民邮电 管银枝主篇)
第十章文件2020/1/2910.1文件概述10.3文件的打开与关闭10.5文件定位函数本章内容10.2文件指针10.4文件的读写10.6本章小结在程序运行时,程序本身和数据一般都存放在内存中(会随系统断电而丢失),当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据或程序运行产生的结果,就必须以文件形式存储到外部存储介质(如磁盘、光盘、硬盘)上。这种永久保存的最小存储单元为文件,因此文件管理是计算机系统中的一个重要的问题。10.1.1文本文件文本文件是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件。10.1.2二进制文件文件作为信息存储的一个基本单位,根据其存储信息的方式不同,分为文本文件(又名ASCII文件)和二进制文件。如果将存储的信息采用字符串方式来保存,那么称此类文件为文本文件。如果将存储的信息严格按其在内存中的存储形式来保存,则称此类文件为二进制文件。10.1文件概述在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为:FILE*指针变量标识符;其中,FILE应为大写,它实际上是系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。例如:“FILE*fp;”在进行读写操作之前要先将文件打开,使用完毕要关闭文件。10.2文件指针10.3文件的打开与关闭打开名为“a.txt”的文件,并向文件输出字符串“ThisismyCprogram!”,然后关闭文件,同时在屏幕上输出fclose()的返回值,应该怎么设计呢?如果需要将程序运行结果存放外存时,应该用什么方法存储呢?应该怎样读入数据或存储数据?打开文件的操作可以用fopen()函数,写入文件有多种方式,以后章节将详细介绍,注意在文件处理的最后调用fclose()函数关闭文件。在关闭文件之后,不可再对文件进行读写操作。程序清单如下:#includestdio.hvoidmain(){FILE*fpFile;intnStatus=0;if((fpFile=fopen(a.txt,w+))==NULL){printf(文件打开失败!\n);exit(0);}fprintf(fpFile,%s,ThisismyCprogram!);fclose(fpFile);getch();}10.3.1文件打开骤进行文件处理时,首先要打开一个文件,在C语言中,所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。在C语言中,文件的打开操作是通过fopen()函数来实现。此函数的声明在“stdio.h”中,原型如下:FILE*fopen(constchar*path,constchar*mode);函数形式参数说明如下:(1)constchar*path——文件名称,用字符串表示。(2)constchar*mode——文件打开方式,同样用字符串表示。(3)函数返回值——FILE类型指针。如果运行成功,fopen返回文件的地址,否则返NULL。应当注意:检测fopen()函数的返回值,防止打开文件失败后,继续对文件进行读写而出现严重错误。根据不同的需求,文件的打开方式有如下几种模式:(1)只读模式:只能从文件读取数据,也就是说只能使用读取数据的文件处理函数,同时要求文件本身已经存在。(2)只写模式:只能向文件输出数据,也就是说只能使用写数据的文件处理函数。(3)追加模式:一种特殊写模式。如果文件存在,则准备从文件的末端写入新的数据,文件原有的数据保持不变。(4)读写模式:可以向文件写数据,也可从文件读取数据。此模式下有如下的几个参数:“r+”,“rb”,要求文件已经存在,如果文件不存在,则打开文件失败。文件打开模式对应表如表10-1所示。char*mode含义注释“r”只读打开文本文件,仅允许从文件读取数据“w”只写打开文本文件,仅允许向文件输出数据“a”追加打开文本文件,仅允许从文件尾部追加数据“rb”只读打开二进制文件,仅允许从文件读取数据“wb”只写打开二进制文件,仅允许向文件输出数据“ab”追加打开二进制文件,仅允许从文件尾部追加数据“r+”读写打开文本文件,允许输入/输出数据到文件“w+”读写创建新文本文件,允许输入/输出数据到文件“a+”读写打开文本文件,允许输入/输出数据到文件“rb+”读写打开二进制文件,允许输入/输出数据到文件“wb+”读写创建新二进制文件,允许输入/输出数据到文件“ab+”读写打开二进制文件,允许输入/输出数据到文件注意:文件打开模式参数为字符串,不是字符。另外,对不同的操作系统或不同的C语言编译器,文件打开模式参数可能不同。10.3.2文件关闭在C语言中,在文件操作完成之后要关闭文件。关闭文件则是指断开指针与文件之间的联系,也就是禁止再对该文件进行操作。在C语言中,文件的关闭是通过fclose()函数来实现。此函数的声明在“stdio.h”中,原型如下:intfclose(FILE*stream);函数形式参数说明如下:(1)FILE*stream——打开文件的地址。(2)函数返回值——int类型,如果为0,则表示文件关闭成功,否则表示失败。文件处理完成之后,最后的一步操作是关闭文件,保证所有数据已经正确读写完毕,并清理与当前文件相关的内存空间。在关闭文件之后,不可以再对文件进行读写操作,除非再重新打开文件。10.4文件的读写设计一个程序,将字符Thisisatesttxtfile!、Ok!、Q写入文件“c:\test.txt”中,然后再从文件“c:\test.txt”中读出所有的字符并显示在屏幕上。要能从键盘上读取字符,再输出到“text.txt”文件中。必须要先将从键盘输入的内容先存到内存,再通过写入文件函数写入到文件中,要能在屏幕上显示文件的内容。也是同样的道理,应先将文件内容读入到内存,再通过以前的输出函数输出到屏幕上。程序清单1:#includestdio.hvoidmain(){FILE*fpFile;charc;if((fpFile=fopen(c:\\test.txt,w))==NULL){printf(文件打开失败!\n);exit(0);}while((c=getchar())!='Q')fputc(c,fpFile);fclose(fpFile);}程序清单2:#includestdio.hvoidmain(){FILE*fpFile;charszFileName[20];intc;printf(请输入文件名字:\n);scanf(%s,szFileName);if((fpFile=fopen(szFileName,w+))==NULL){printf(文件打开失败!\n);exit(0);}while((c=fgetc(fpFile))!=EOF)putchar(c);fclose(fpFile);}程序运行结果如下:输入:Thisisatesttxtfile!Ok!Q文件c:\test.txt的内容如下:Thisisatesttxtfile!Ok!程序运行结果如下:请输入文件名字:c:\test.txt输出:Thisisatesttxtfile!Ok!10.4.1字符的读写fputc()与fgetc()函数和标准输入输出函数getchar()与putchar()类似,其“stdio.h”中的原型如下:intfputc(intc,FILE*stream);intfgetc(FILE*stream);fputc()函数的作用是从当前文件位置开始向文件输出一个字符。函数说明如下:(1)intc——准备输出的字符。(2)FILE*stream——文件地址,为FILE*类型变量。(3)函数返回值——int类型。如果返回值为1(EOF),则表示字符输出失败,否则返回值为c,即与输出的字符相等。Fgetc()函数的作用是从当前文件位置读取一个字符。函数形式参数说明如下:(1)FILE*stream——用读写模式和只读模式打开的文件地址,为FILE*类型变量。(2)函数返回值——int类型。如果返回值为1,表示已经读到文件末尾,否则返回读到的字符。10.4.2格式化读写文件输入输出函数中提供了与scanf()和printf()类似的函数——fscanf()和fprintf(),其在“stdio.h”中的原型如下:intfprintf(FILE*stream,constchar*format,...);intfscanf(FILE*stream,constchar*format,...);对比intprintf(constchar*format,...);intscanf(constchar*format,...);发现,文件输入输出函数中仅仅多了形式参数FILE*stream,即文件地址,其他的形式参数完全相同。例如:scanf(“%d”,&d)的作用是从键盘中读取一个整型数据到变量d中。fscanf(stream,“%d”,&d)的作用是从当前打开的文件中读取一个整型数据到变量d中。【例10-1】从键盘读入5位同学的姓名、数学成绩、物理成绩和化学成绩,并计算总分后输出到文本文件“student.dat”中。分析:要求从键盘上输入5位同学的信息并求出总分到文件中,首先得从键盘上输入信息存到变量中,再由变量存到文件中,即先用scanf()函数输入到变量,并算出总分,再用fprintf()写入到文件中。程序清单如下:#includestdio.hvoidmain(){FILE*fpFile;floatfPhyscial,fMath,fChemical;floatfTotal;charszName[20];inti;if((fpFile=fopen(student.dat,w))==NULL){printf(文件打开失败!\n);exit(0);}Printf(请输入信息:\n);printf(姓名\t物理\t数学\t化学\n);for(i=0;i5;i++){scanf(%s%f%f%f,szName,&fPhyscial,&fMath,&fChemical);fTotal=fPhyscial+fMath+fChemical;fprintf(fpFile,%s\t%2.2f\t%2.2f\t%2.2f\t%2.2f\n,szName,fPhyscial,\fMath,fChemical,fTotal);}fclose(fpFile);if((fpFile=fopen(student.dat,r))==NULL){printf(文件打开失败!\n);exit(0);}printf(您所写入到文件的内容是:\n);printf(姓名\t物理\t数学\t化学\t总分\n);while(!feof(fpFile)){fscanf(fpFile,%s%f%f%f,szName,&fPhyscial,&fMath,&fChemical,&fTotal);printf(%s\t%2.2f\t\t%2.2f\t%2.2f\t%2.2f\n,szName,fPhyscial,fMath,\fChemical,fTotal);}}程序运行结果如下:请输入信息:姓名物理数学化学John78.5085.5090.00Bob89.5091.0082.00Lili82.5090.0087.00您所写入到文件的内容是:姓名物理数学化学总分John78.5085.5090.00254.00Bob89.5091.0082.00262.50Lili82.5090.0087.00259.5010.4.3块的读写文件输入输出函数中还提供了块的输入输出函数,即将内存中的一段信息作为一个整体进行输入输出操作,其在“stdio.h”中的原型如下:size_tfread(void*ptr,size_tsi
本文标题:第十章 文件(人民邮电 管银枝主篇)
链接地址:https://www.777doc.com/doc-3378146 .html