您好,欢迎访问三七文档
当前位置:首页 > 学术论文 > 经济论文 > 中央电大C语言A课程辅导8
1C语言程序设计A课程辅导(8)---第8章文件主要内容:一、文件的概念二、文件的打开和关闭三、文本文件的访问操作四、二进制文件的访问操作五、课程总复习一、文件的概念文件是计算机外部设备中一个被命名的信息单位标准输入输出(I/O)设备文件:如stdin和stdout分别表示标准输入设备键盘和标准输出设备显示器。这两个文件流标识符在stdio.h系统头文件中有定义,类型为FILE*,其中文件类型(FILE)也在stdio.h中定义。我们可以随时从stdin中读出(即从键盘输入到内存)信息,也可以随时向stdout中写入(从内存输出到文件)信息。外存储设备中保存的文件:由用户命名,并规定访问文件的方式。如只允许向其写入信息的输出方式的文件,只允许从已有文件中读出信息的输入方式的文件,又允许写入又允许读出的输入和输出方式的文件等。文件的3种基本的访问方式输入方式:从文件读出数据到内存变量(数组)中保存。输出方式:把内存变量(数组)的内容送入到文件中保存。既输入又输出方式:对于同一个文件,可以既进行输入又进行输出。文件名给需要使用的数据文件所起的名字,它包括文件主名和扩展名两部分。符合命名规定的任何标识符都可以作为主名,如可用gongzi作为工资文件的主名。扩展名由1-3个字符所构成,如可用txt作为一个扩展名。在一个文件名中可以省略扩展名。若带有扩展名,则用句点与主名分开。如works.ran、工资.bin等。文件类型和文件流在C语言系统中,系统预定义了一种文件类型,文件类型标识符为FILE,当需要使用一个数据文件时,必须根据该文件名和访问方式返回一个具有FILE类型的指针值,接着把这个值保存到具有FILE*类型的指针变量中,以后就用这个指针变量(文件流)代替所对应的文件,完成对文件的操作。我们前面提到的stdin和stdout分别是系统定义的标准输入和输出文件流。文件结束符(EOF)在每个数据文件的结尾都利用一个字节保存一个文件结束标记(-1),在stdio.h中,把-1定义为符号常量EOF。文件长度文件中保存数据所占有的存储字节数。当一个文件用来保存记录结构的数据时,有时也把保存的记录个数称为文件长度,此时的文件字节长度等于记录个数乘以记2录结构类型的长度。数据文件分类C语句文件按存储信息方式的不同可分为字符文件和字节文件两种。字符文件又称文本文件或ASCII码文件。字节文件又称二进制文件或内部格式文件。字符文件:文件中保存的字符串信息和数值信息都采用字符的ASCII码的形式。当然对于汉字信息采用2字节的汉字区位码。如保存常数23时,对应保存的ASCII码为50和51。字节文件:文件中保存的字符串信息仍采用字符的ASCII码的形式,而保存的数值信息则采用其内部格式。如保存常数23时,因为它是一个int类型的常数,须占用4个字节,对应保存的二进制数为00010111,前面还有3个字节的24个0。文件操作函数包括打开文件、关闭文件、读取数据、写入数据、移动文件指针位置等,它们的函数原型都保存在系统头文件stdio.h中,调用这些函数时必须通过#include命令包含此头文件。二、文件的打开和关闭1.打开数据文件要访问一个文件,首先要按照一定的方式打开一个文件,并使之与一个文件流相联系,然后才能进行存取数据的操作。当对一个文件的处理操作结束后,就把它关闭掉。打开一个文件,需要调用C函数库中的fopen()函数,得到相对应的文件流。该函数的原型为:FILE*fopen(constchar*fname,constchar*mode);fname参数:用于指向要打开文件的文件名字符串,该字符串内可以带有盘符和路径名,若省略盘符和路径名则隐含为当前盘和当前路径,即保存当前程序文件的磁盘和路径,mode参数:用于指定打开文件的方式,它也是以字符串的形式给出的,mode是指向该字符串的指针。如果调用该函数成功,则返回一个文件指针,即文件名为fname、打开方式的mode所对应的文件流,以后就利用它操作文件。如果调用该函数失败,则返回空指针(NULL),表明没有打开指定的文件,不能进行访问操作。2.打开数据文件的方式打开数据文件的方式有以下用字符串表示的12中不同方式:r//打开一个用于输入的文本文件,若文件不存在则打开失败w//打开一个用于输出的文本文件,存在清空,不存在则建立a//打开一个用于向尾部追加输出的文本文件,不存在则建立rb//打开一个用于输入的二进制文件,若文件不存在则打开失败wb//打开一个用于输出的二进制文件,存在清空,不存在则建立ab//打开一个用于向尾部追加输出的二进制文件,不存在则建立r+//打开一个用于读/写操作的文本文件,不存在则打开失败w+//打开一个用于读/写操作的文本文件,不存在则建立3a+//打开一个用于读/追加写操作的文本文件,不存在则建立rb+//打开一个用于读/写操作的二进制文件,不存在则打开失败wb+//打开一个用于读/写操作的二进制文件,不存在则建立ab+//打开一个用于读/追加写操作的二进制文件,不存在则建立总之:r(read)为读、w(write)为写、b(binary)为二进制、+为读/写3.打开数据文件举例(1)FILE*fp1;//定义一个文件指针变量fp1fp1=fopen(xxk1.dat,w);//以只写方式打开当前路径和目录中//的本文文件xxk1.dat,返回的文件流赋给文件指针变量fp1(2)FILE*fp2=fopen(d:\\C语言练习\\wr.dat,r);//以只读方式//打开指定目录内的文本文件wr.dat,返回的文件流赋给fp2(3)FILE*fp3=fopen(xxk2.ran,wb+);//为同时能够进行读/写//和二进制操作方式而打开当前目录中的xxk2.ran文件,//返回的文件流赋给文件指针变量fp34.数据文件的关闭关闭一个文件,需要调用C函数库中的fclose()函数,该函数的原型为:intfclose(FILE*fp);如果fp所对应的文件关闭成功则返回0,否则返回-1(EOF)表示失败。若要关闭已经打开的fp1文件流所对应的xxk1.dat文件,则调用:fclose(fp1);打开一个文件并处理结束后,最好使用fclose()函数调用关闭它,这样才能够保证临时存储在文件缓冲区的内容全部写入到外存的文件中。三、文本文件的访问操作1.向文本文件输出数据调用在stdio.h头文件中声明的fputc()函数或fputs()函数。这两个函数的原型为:intfputc(intch,FILE*stream);//向文件写入一个字符intfputs(constchar*str,FILE*stream);//向文件写入一个字符串fputc函数在操作成功时返回原字符,否则返回-1。fputs函数在操作成功时返回0,否则返回-1。应用举例例1向d盘xxk目录下的wr1.dat文件依次输出26个小写英文字母。分析:若d盘上没有xxk目录,则要首先建立此目录,然后才能够编写C程序使用此目录建立文件。在程序的主函数中,首先要根据文件名和访问方式打开此文件,得到对应的文件流,接着依次向其写入26个小写英文字母,最后关闭该文件。此题的参考程序如下:#includestdio.h#includestdlib.hvoidmain(void)4{inti;FILE*f1;//定义文件指针以便保存文件流f1=fopen(d:\\xxk\\wr1.dat,w);//以写文本方式打开返回文件流if(f1==NULL){//当f1对应的文件不存在则退出运行printf(不能够打开文件!\n);exit(1);}for(i=0;i26;i++)fputc('a'+i,f1);//向f1文件流输出每个字母fclose(f1);//关闭f1所对应的文件}通过使用操作系统提供的记事本窗口可以查看该文件的内容。例2把从键盘上输入的若干行文本字符原原本本地存入到d盘xxk目录下的wr2.dat文件中,直到从键盘上输入一空行(即只按下回车键)为止。分析:此程序的主函数同样包括定义文件流、打开文件、接收键盘输入和写文件、关闭文件等操作。#includestdio.h#includestdlib.h#includestring.hvoidmain(void){charstr[80];//定义一个字符数组,保存输入的一行字符FILE*f2;//定义文件指针对象,用来保存一个文件流f2=fopen(d:\\xxk\\wr2.dat,w);//以写方式访问文件if(!f2){//当f2打开失败时退出运行printf(CannotopenFile.\n);exit(1);}printf(在下面输入若干行文本建立文本文件:\n);while(1){//执行while循环gets(str);//用str保存从键盘上输入的一行字符strcat(str,\n);//在字符串的末尾添加一个换行符if(*str=='\n')break;//若输入的是空串则离开循环fputs(str,f2);//把str所指向的字符串写入到f2文件}fclose(f2);//关闭f2所对应的文件}2.从文本文件输入数据5调用在stdio.h头文件中声明的fgetc()函数或fgets()函数。这两个函数的原型为:intfgetc(FILE*stream);char*fgets(char*str,intlength,FILE*stream);fgetc函数从文件流中的当前字节位置读出一个字符并返回。若读到文件结束标记则返回-1。fputs函数从文件流中的当前字节位置起读出一行字符(要小于length长度)并保存到str字符数组空间,同时返回str值。若没有读到任何内容则返回NULL。应用举例例3从上面例1所建立的“d:\xxk\wr1.dat”文件中输入全部数据并依次显示到屏幕上。分析:该文件保存着26个小写英文字符,以读方式打开该文件后,文件当前访问位置是文件开始位置,即第1个字节的位置,每次读出一个字节内容(字符)后,当前访问位置自动后移,接着可以读取下一个字符。程序如下:#includestdio.h#includestdlib.hvoidmain(void){charch;FILE*f3=fopen(d:\\xxk\\wr1.dat,r);//得到输入文件流if(!f3){//当f3打开失败时退出程序运行printf(d:\\xxk\\wr1.datfilenotopen!\n);exit(1);}ch=fgetc(f3);//从文件开始处读出一个字符while(ch!=EOF){//ch不等于文件结束符时则循环printf(%c,ch);//向屏幕窗口输出ch所保存的字符ch=fgetc(f3);//继续从文件读出一个字符}printf(\n);fclose(f3);//关闭f3所对应的文件}该程序运行结果如下:abcdefghijklmnopqrstuvwxyz例4从上面例2所建立的“d:\xxk\wr2.dat”文件中按行读出全部数据,并把它们依次显示到屏幕上,同时统计出文件内容中的行数。分析:首先以读方式打开文件返回文件流,接着从文件头开始依次读出每行字符串并显示输出和计数,最后关闭文件。#includestdio.h#includestdlib.h6voidmain(void){inti=0;//定义i用来统计行数charstr[80];//定义str数组用来保存一行字符串FILE*f4=fopen(d:\\xxk\\wr2.dat,r);//得到对应的文件流if(!f4){printf(文件没有打开!\n);exit(1);}while(!feof(f4))//文件未结束时执行循环char*p=fgets(str,80,f4);//读出一行字符串到str字符数组if(!p)break;//若从文件中没有读到内容则退出printf(%s,str);//向
本文标题:中央电大C语言A课程辅导8
链接地址:https://www.777doc.com/doc-8688725 .html