c语言基础教程 第十章 文件和读写函数.doc_第1页
c语言基础教程 第十章 文件和读写函数.doc_第2页
c语言基础教程 第十章 文件和读写函数.doc_第3页
c语言基础教程 第十章 文件和读写函数.doc_第4页
c语言基础教程 第十章 文件和读写函数.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言基础教程 10.1.1 文件和文件指针1.文件 一般说来,文件是有序数据的集合。程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。文件是被存放在外部存储设备中的信息。对文件的处理过程就是面向文件的输入和输出过程。文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息流或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。 C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件n C语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。两种存放方式各有利弊。以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。2.文件指针 文件指针是一种用来指向某个文件的指针。如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。 每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。这些信息被保存在一个结构变量中,该结构变量所对应结构模式被系统定义为F ILE,它被放在,stdio h文件中。有些版式的FILE被定义如下: type struct int fd; /*文件号*/ int cleft /*缓冲区内剩余的字符*、 int mode; /文件操作模式*/ char * mexic; /*下一个字符位置*/ char * huff; /*文件缓冲区位置*/ FILE; 在文件操作的程序中,要使用FILE来定义文件指针,并且将打开的文件缓冲区的首地址赋给文件指针,让它指向该文件。例如 FILE:*FP; 其中,fp是一个指向文件的指针。 fp,fOpenahc.txr,r): 给fp赋值,使它指向abc, txt文件。于是。fp便是一个指向abc.txt文件的指针。有了文件指针以后,对文件的操作(读、写和关闭等)都使用文件指针,而不使用文件名。3.读写 读写指针当一个文件被打开后用来标识读写文件位置的。它与文件指针是不同的。文件指针一旦被指向某个文件。它的值是不会改变的,直到该文件被关闭为止。而读写指针是当某个文件被打环时,它指向文件头或文件尾(与打开方式有关),可以通过定位函数(fseek( )来改变读写指针的位置。可见,读写指针与文件指针是两个完全不同的概念,在使用时应注意分清。 关于指针的详细描述,在本章后面讲述文件定位函数时还会讲到。C语言基础教程 10.1.2 标准文件和一般文件1.标准文件C语言中规定的标准文件一有三个,它们分别是标准输入文件(键盘)、标准输出文件(显示屏幕)和标准出错信息文件,规定错误信息显示在屏幕上。这二个文件的文件指针分别为标准输入文件是stdin,标准输出文件是stdout,标准出错信息文件是stderr。 标准文件的特点是这类文件使用前不必打开,使用后不必关闭。因为系统将它在启动系统时自动打开。在退出系统时自动关闭,并且自动为这三个标准文件分配缓冲区,指定文件指针。因此,使用标准文件十分方便J这也是在前面所讲述的内容中没有涉及到文件打开和关闭操作的原因。到现在为止,所使用的读写函数(即输入输出函数)都是对标准文件的,而对于一般文件(即非标准文件)的操作在本章后面再讲述。 2.一般文件 般文件是指除了土述的标准文件以外的文件,包括设备文件和磁盘文件。 一般文件的特点是操作前需要先打开文件,操作后要及时关闭文件。打开文件和关闭文件由专门的函数实现这一操作。执行打开文件函数实现打开文件的操作就是在内存中建立1个fit放文件的缓冲区。如果打汗文件成功,则内存建立了一个缓冲区,这时打开文件函数将返回一个地址值。将它赋给一个定义的文件指针。让它指向该文件。如果打开文件失败则内存中不建立缓冲区,这时打开文件函数返回NULL.一旦文件被打开后,便可以对该文件进行读或写操作,对于一般文件来讲,打开文件是进行读写操作的前提。打开的文件操作完成后,要及时关闭文件,关闭文件由专门关闭文件函数来实现。及时关闭文件可以及时释放所占用的内存空间,还可以保证文件内容的安全。关闭文件是将文件从内存中清除,送回到磁盘中,因此,不要把关闭文件看成是删除文件。应该养成及时关闭不用文件的好习惯。C语言基础教程 10.1.3 高级读写函数和低级读写函数 UNIX系统下的c语言版本对文件的处理方法分成两种:一种叫缓冲文件系统,另一种叫非缓冲文件系统.缓冲文件系统是指系统在内存区域中自动地为打开的文件开辟一个缓冲区。对文件数据的读写都要经过缓冲区。具体操作是当从内存中输出数据时,先将数据送到内存缓冲区,装满缓冲区后一起送到磁盘;当从磁盘向内存装入数据时,则是从磁盘文件中一次将一批数据送到内存装满缓冲区,然后再从缓冲区逐个地将数据送到程序数据区,赋给程序变量。一般地,缓冲区大小为mz个字节。非缓冲区是指系统不为文件自动建立缓冲区,而是程序为每个文件设定缓冲区。 一般地认为,使用缓冲文件系统进行文件读写操作的称为高级读写函数,它与机器无关;使用非缓冲文件系统进行文件读写操作的称为低级读写函数,它与机器相关。早先规定用缓冲文件系统处理文本文件。用非缓冲文件系统处理二进制文件,后来将缓冲文件系统扩充为可以处理二进制文件。 本书着重讲解高级读写函数的使用,考虑到低级读写函数使用较少,本书将不再介绍,如果需要可阅读有关资料。 c语言中,设有输入输出语句,而对文件的读写操作的函数都是用库函数来提供的。C语言基础教程 10.2.1 标准文件读写函数介绍 在第一章中对标准文件的读写限数已经作了较为详细的讲述。这里,再作一些简单介绍和补充。 1.对一个字符的读写函数 读一个字符的函数getchar( ),该函数用来从键盘缓冲区中每次读取一个字符,该函数的返回值为读取字符的ASCII码值。 写一个字符的函数purchar(),该函数有一个参数,其功能是将参数给出的字符输出到屏幕上。 2.对一个字符串的读写函数 读一个字符串函数gets( ).该函数返回一个宇符型指针,该函数有一个参数,该参数是用来存放读取的字符的。该函数的功能是从键盘上读取一个字符串存放到该函数参数所指定的字符数组中,返回指向该字符数组的指针。 写一个字符串函数puts( ),该函数的功能是将其参数中所指定的字符串输出到显示屏幕上。该函数的参数是一个字符数组或字符指针,或字符串常量。 3.具有指定格式的读写函数 这里再补充介绍标准格式输入函数scanf()和标准格式输出函数printf( )的一些内容。 (1)标准格式输入函数scanf() 该函数格式如下: scant(控制串),(参数表) 该函数有关参数说明在第一章中已经讲述过了。下面仅作两点补充。 一是在(控制串)中除了格式符外,还可用除空格符以外的一般字符,一般字符作为匹配符。所谓匹配符是用来确定输入数据流中愉入项的。在控制串中使用一般字符作为匹配符时。输入数据流中要有与匹配符对应的字符来区分数据流中的输入项。例如,控制串中出现匹配符逗号(,),则在输入流中要以逗号来分隔输入项,要求控制串中出现的匹配符要与输入流中出现的分隔符一致,即字符相同,次数相等。C语言中用来区分输入流的数据输入项的方法有三;一是前面讲述的用匹配符的办法;二是在格式符中加最大域宽的修饰符;三是使用默认的输入项分隔符-空白符,这时控制串中不加任何其他字符。 二是在控制串中,格式符里%与格式说明符之间可以加如下修饰符: (1)数字。用来表示最大的域宽。如果输入流中数据位数超过最大域宽,则只取最大域宽的位数,其后舍去;如果输入流数据位数不足最大域宽,则按实际宽度读取。 (2)!字符,!字符用在表示int型数的格式符d.o,x前面,表示长整型;用在格式符f前面表示双精度浮点数。 (3)h字符。h字符只可用在表示int型数的格式符d,o,x前面,表示short int型。 (4)*字符。这是一个抑制符,表示跳过关后面整数所指出的输入域宽,如果没有表示跳过的整数域宽,则跳过一个输入域到下一个空白符。 例10.1 分析下列程序的输出结朱。注意标准格式输入函数的使用。main()int a.b,c;prinrf(Enyer a b c);scant(%2d%*%3d,3d%4d,&a,&b,&c);printf(a-%d,b-%d,c-%dn,a,b,c 执行该程序输出如下信息: Enter a b c:1234567890 输出结果如下: a=12,b=678, c=90 说明:该例中,scanf ( )函数中格式符里使用了数字来规定输入项的最大宽度,并用星号符来抑制某些输入项:该控制串中各格式符的规定说明如下:将前2位整数赋值给变量a,然后跳过3位整数,再将3位整数读取给变量b,最后还剩下2位数读取给变量c,变量c对应的输入最大宽度为4位,不足4位有几位取几位。在实际应用中,常用抑制符来跳过不想输入的数据项。 (2)标准格式输出函数prntf 该函数的格式如下: printf(控制串),(参数表) 该函数有关参数说明在第一章中已经讲述过了。下面再作两点补充。 一是在在控制串%*.3fn中,荞对应的表示域宽的变量为参数表中的i.i值为5,则控制串相当于%5.3fn.该格式要求小数取3位,该数值整数有2位。加1位小数点,共6位,大于指定的最小域宽5,于是按实际宽度输出,最后一位四舍五入。 (2)在控制串%O1O.*fn中,*对应的表示小数位数的变量为参数表中的i,即5格式中指定最小域宽为l0.并且数据前面补的空格符用0替换。输出数据有2位格数,5位小数,再加1位小数点,共8位,因此数据前还应有2个0. (3)在控制串%o.*f/n中、第一个*对应的表示最小域宽的变量为参数表中i+6表达式,其值为11,第二个*对应的表示小数位数的变量为参数表中的i,即5.格式中又指定用0替换数据前填补的空格符。因此,输出结果为OOO12. 345680。 二是printf()函数也有一个返回值,该值是表示输出函数所输出的所有数据项所占的总宽度。 例10.3 分析下列程序输出结果。注意分析printf()函数的返回值。main()int a,b,c;a=100;b=256;c=printf ( %05d,%05dn”,a,b);printf(%dn,c);) 执行该程序输出结果如下 00100,00256 12 说明:程序中变量c是用来存放printf ( )函数的返回值的。该函数的实际输出宽度是a,b变量各5位,逗号1位,换行符1位,共12位。C语言基础教程 10.2.2标准文件的读写函数应用标准文件的读写函数在C语言程序中有着广泛的应用,因此熟练地掌握这些函数是十分重要的。特别是scanf ( )和printf ( )函数应用更多,而它们还有一定的复杂性,在应用中更应特别注意。下面讲述这些函数在使用中应该注意的一些事项。 (1)由于getch()函数是带有缓冲区的,使用时应注意缓冲区剩余字符对后面输入函数的影响。 例10.4分析下列程序的输出结果。#includemain()int i.j,k;printf( Enter 1 character:“);i=getchar();,printf(%Cn,i);printf(Enter ! character;);j=getchar( );printf(Enter 1 character:”);k=getchar()。printf(%c,%cn,j,k); 执行该程序后,显示如下信息: Enter 1 character: a 健入字符a和回车后,输出如下信息: a Enter 1 character:Enter 1 character:b 健入字符b和回车后,输出如下信息: .b 说明:该程序中使用getchar()函数从键盘中接收到字符,当在Enter 1 charade ;提示信息后输入a后,则输出信息如上所示,其原因是因为键入的实际是两个字符,a字符和回车符。将a字符送给变量i.将回车符送给了变量j,因此第二个Enter 1 character:提示则不需要再输入字符,于是出了第三个Enter 1 character提示,当键入b了后,输出结果告诉我们,i变量中的字符的确是回车符,因为在输出,b字符之前空了一行,而k变量的字符为b. 为了实现每个提示信息都要输入一个字符送给相应的变量,就需要及时消除缓冲区内多余的字符。例如,键入a了后,缓冲区中有两个字符,a是有用的,回车符是多余,于是要将多余的回车符消除,否则它将影响后面的继续输入。其办法可用getchar()函数来吃掉一个字符。上述程序可作如下修改。#includemain()int i,j,k;printf(Enter 1 character:“);i=getchar();getchar();prinif(%cn,i);printf(Enter 1 character:);j=getchar();getrhar();printf(Enter 1 character:”);k=getchar ();printf (%c,%cn,j,k)执行该程序市场如下信息;Enter 1 character: aaEnter 1 character: bEnter 1 character: Cb,c 执行该程序市场如下信息; Enter 1 character: a a Enter 1 character: b Enter 1 character: C b,c 说明:该程序中增加了两条getchar();语句,其目的是为了消除缓冲区中剩余的无用字符,使程序得以正常进行。该程序中,由于缓冲区中只有一个多余字符,因此使用一次getchar()函数,如果缓冲区中有多个剩余字符又该怎办呢?请读者思考。 (2)标准格式输入函数scan ( )也是带缓冲区的,它也存在有剩余字符的及时处理问题。 例10.5 分析下列程序输出结果。注意由于scanf()函数是带缓冲区的所产生的影响。main()char s110,s210;printf(Input a string :);scanf(%4s,s1);printf(s1,%sn,s1);printf(Input a string:);scanf(%s,s2);执行该程序显示如下信息:Iinput a string:abcdefs1:abcdInput a string :s2:ef 执行该程序显示如下信息: Iinput a string:abcdef s1:abcd Input a string :s2:ef 说明:出现上述输出结果是因为键人abcdef加回车键后,字符数组S1接受4个字符abed, 并自动加上字符串结束符。这时字符串缓冲区中还有ed和换行符。程序中输出显示s1后,屏幕出现下一个,Input a string;提示信息,由于缓冲区还有剩余字符,则不再需要键盘输人信息。而自动将缓冲区剩余字符ef赋给字符数组s2.出现s2:ef的结果。 为了及时清除缓冲区中的剩余字符,叮在下一次使用scanf()之前,用下述方法清除缓冲区中的剩余字符: while (getchar(); (3)在scanf()函数中,%c与%s这种格式的区别主要表现在如下两个方面:一是字符格式时变量只接收一个字符;而字符串格式时除接收规定的字符外,还自动加0,二是字符格式时,遇到字符包含空格符都作为字符输入;而字符串格式时,非空格符前边的前导空格被略去,不作为字符输入,而从非空格符开始进行输入。 例10.6 分析下列程序的输出结果。注意格式符%c与%s的区别。main()char s=1234567;printf(Input s:);scanf(%4c,s);printf(s:%sn,s);printf(Input s:);scanf(%4s,s);printf(s;%sn,s); 执行该程序输入如下信息: Input s:ab s: ab567 Input s: ab s:ab 说明;该程序中输人两个相同的字符串,但是输出结果却不同,其原因在于scanf ( )函数中两次所用的格式符不同,一次用%4c,另一次使用%4s.于是,该程序的输出结果将十分清楚告诉我们,%c和%s,这两种格式的区别,详细情况请读者自行分析。 (4) scanf()函数在正常情况下,它的参数表中的每个参数都能获得指定的数值,但在非正常情况,当某个参数所斌予的值与其指定的格式相矛盾时,则结束整个的输入,scan()函数中后面的参数将没有被赋值。 例10.7 分析下列程序的输出结果。注意scanf()函数的返回值和各变量的输出结果。main()int a,nchar b;float c;n=scanf (%3d%c%f,&a,&b,&c);printf( %dn,n);printf (%d,%c,%fn,a,b,C); 当输入信息流如下所示: 123 a 146.78 这时的输出结果如何呢?有人认为输出结果应该如下所示: 3 123.a.16.78000 可见,实际上的输出结果并非如此,为什么呢?请读者自己分析,并上机验证。 如果将输入信息流改为下述情况: 123a46.78 结果又将回怎么样呢? 进一步加深对%c格式的认识。 (5)在实际中字符串的输入和输出可以使用gcts()和put()函数比较方便。 【例10.8】分析下列程序的输出结果。注意gets()和puts()函数的使用方法;mxin()char s110,s210;printf (Input a string:“)gets (sl);puts (s1);printf (Input a string:”)gPtS(S2);puts(s2);执行该程序显示如下信息:Input a string:ahcdeabcdeInput a string:xyxmnxyzmn 说明:该程序中使用gets( )函数从键盘一上接收一个字符串,使用puts( )函数将该字符目输出到屏幕上显示,使用起来十分方便。 实际中也可用gets ( )函数接收一个整型数,然后用atoi()函数将它转换成整型数。C语言基础教程 10.3.1 打开文件函数和关闭文件函数 一般文件在对它进行读写操作之前需要打开,打开文件函数格式如下: fp=fopen (文件名),(打开方式) 其中,fopen是打开文件函数的名字,该函数有两个参数,一个是(文件名),该参数是一个字符串,需用双撇号()括起,文件名要全一名,即包含路径名和扩展名。另一个是(打开方式),它也要用双撇号括起。打开方式的选择如下所示: r 表示读方式 w: 表示写方式 a: 表示追加写方式 r十w: 表示读写方式,也可写成r十 rb: 表示二进制文件读方式 wb: 表示二进制文件写方式 ab; 表示二进制文件追加写方式 br+: 表示二进制文件读写方式 该函数如果成功地打开了指定的文件,则返回该文件的内存缓冲区的首地址,将它赋给一个被定义为文件指针的变量,于是该指针将指向这个被打开的。文件,直到被关闭为止;如果该函数没有成功地打开文件,则返回值为NULL.因此,在执行打开文件的操作后,总要判断一下返回值是否为NULL_,如果返回值为NULL,则说明文件打开失败,一般应退出该程序,检查失败的原因。因此,常用如厂程序段来对没有打开文件进行处理: if(fp=NULL) ) printf(file cant open!n): exit(l); 其中,fp是文件指针,用它来接收fopen ( )函数的返回值。exit( )是。个退出当前的执行的程序的函数,当文件没有被打开时,一般应退出程序。 函数只有被成功的打开后才可以对它进行读写操作。一旦文件的读写操作完成后,应该及时地将它关闭。关闭文件函数的格式如下: fclose(fp) 其中,fclose是关闭文件函数的函数名。 fp是要关闭文件的文件指针。使用该函数可以将一个被打开的函数关闭,同时释放它所占用的内存缓冲区。当不使用该函数关闭打开的文件时,当该程序执行完后,也会将打开的文件关闭。 关于打开文件函数fopen()和关闭文件函数fclose()将在后面举例说明。C语言基础教程 10.3.2 一般文件读写函数及其使用 一般文件的读写函数共有4对,下面分别加以介绍,并且举例说明它的使用。 1.对一个字符的读写函数 (1)一个字符的读写函数fgetc ( ) 该函数的功能是从被打开的文件中读取一个字符。该函数的调用格式如F: c=fgexc(fp); 其巾,fgetc.是该函数的函数名,印是一个文件指针,c是一个char型变量,使用fgetc ( )函数可从由fp指针所指向的文件中读取一个字符送给某个char型变量c.反复使用该函数可以将某个文件从头到尾读一遍,直到文件结束,即遇到EOF时为止。如果fp为stdin时,该函数等价于getchar()函数。 使用该函数读取文本文件时,当读取到EOF时便可结束,因此要作如下判断: (c=fgetcfp)!=EOF 若满足上述条件,可继续读取;若不满足该条件,则结束读取。 使用该函数读取二进制文件时,常用feof ( )函数来判断是否文件结束,因为EOF被定义为一1,用来判断二进制文件不太合适。fcof ( )函数调用格式如下; feof (fp); 该函数返回值为1时表示文件结束,该幽数返回值为。时表示文件没有结束。因此,在采用循环方式读取二进制文件内容时,循环语句的条件如下所示: !feof(fp) 该表达式值为非0时,继续循环;该表达式值为0时表示文件结束,则停止循环。这种方法也可以用于文本文件的操作中。 (2)一个字符的写函数fputc() 该函数的功能是将一个指定的字符写到指定的文件中。调用格式如下: fput(c,fp); 其中,如fputc是该函数的函数名,fp是一个文件指针名,c是一个char型变量。该函数用来将变量c中的字符写到文件指针fp所指向的文件中。该函数成功时返回所写字符的代码值,失败时返回EOF. 当fp为stdout时,fpuatc(c,stdout)函数等价于putchar(c)函数。例10.9显示一个文件的内容。#include main(argc,argv)int argc;char* argv;int c,F1LE*fpif(argc!=2)printf(Foemat:nt%s filenamen,argv0;exit(1);f(fp=fopen(argv1,r)=NULL)printf(Th file %s,cant open,n,argvl);exit(2);while(c=fgetc(fp)!=EOF )putchar(c);fclose(fp); 执行该程序时,将命令行参数中所指定的文件的内容显示在屏幕上。 说明:该程序主函数中使用了两个参数argc和argV,它们分别用来存放命令行中参数的个数和参数的内容。执行该程序时,命令行需要有一个参数,该参数(实参)应该是被打开文件的文件名,即将该文件内容显示在屏幕上。假定该程序编译连接后可执行文件名为typefile.exe,则命令行格式如下: typefile fl. c 其中fl.c是要显示的文件的名字。执行该命令行后。fl.c一文件的内容被显示在屏幕上。 该程序是用fgetc()函数,从fp文件指针所指向的文件中读取每一个字符,再用putchar()函数将它显示在屏幕上。例10.10复制一个文件。#includemain (argc,argvint argc;char*argv;int c;FILE,*fp,*fpif(argc!=3)printf(007Usage:command fife 1 fife2.n);exit(1):if (fp fopen (argv1,r r)= NULL)printf(007The file %s cant open.n,argv1);exit(2);if( (fq=fopen (argv2,w)=NULLprintf(007The file %s cant open.n”,argv2);exit(3);while(c=fgetc(fp)=EOF)fputc(c,fp);fclose(fp);fclose(fp) 执行该程序,则将命令行中参数1所指定的文件名中的内容复制到由参数2所指定的文件名中,假定该程序经过编译连接后,生成的可执行文件名为c0pyfile. exe,则命令行格式如下: copyfile f1. c f2.c 其中,fl.c是源文件名,f2.c是目标文件名,该程序将fl.c文件的内容复制到f2.c中,使得fl, c成为fl.c的一个副本。 该程序中,使用fgetc ( )函数从fp文件指针所指向的文件中一个字符一个字符地读取,再使用fputc ( )函数将读取的一个个字符写到由fq指针所指向的文件中。这里,印指向文件fl.c.fq指向文件f2.c (3)字符回送函数ungetc() 该函数的功能是将预读的一个字符送回原文件中,即将文件的读写指针向文件头移动,一个字符。该函数的调用格式如下: ungctc(c,fp); 其中,ungetc是该函数的名字,c是被回送的字符,fp是被操作的文件。 2.对一个字符串的读写函数 (1)一个字符串的读函数fgets() 该函数的功能是从指定的文件中读取一个字符串放到指定的字符数组中。该函数的调用格式如下: (gets(s,n,fp) 其中,fgets是该函数的函数名,该函数有3个参数:,是一个用来存放读取出来的字符串的字符数组名,或字符指针名;n是用来指定读取字符的个数,其中包含字符串结束0,实际上读取字符为n-I个;fp是被读取字符串的文件指针。该函数是从被打开的由fp文件指针所指向的文件中读取n-1个字符送到所指定的字符数组,中。在实际操作中,不一定每次都读取n一1个字符,当读取到换行符或文件结束符时,都将结束读取操作将已读取的字符送到数组S中。该函数的返回值是指向字符数组s的指针,出错时返回NULL a读入到s中的字符自动加,0. (2)一个字符串的写函数fguts ( ) 该函数的功能是将指定数组中的字符串写到由文件指针所指向的文件中。该函数的调用格式如下: (fput(s,fp) 其中,fputs是该函数的函数名,该函数有2个参数:一个是存放已知字符串的字符数组s,另一个是被打开文件的文件指针fp.该函数是用来将字符数组s中的字符串写到fp文件指针指向的文件中。正常时函数返回写入文件的字符个数,出错时返回NULL.参数s可以是字符数组名、字符指针名,也可以是一个字符串常量。 3.对一个数据块的读写函数 (1)数据块的读函数freed ( ) 该函数的功能是从指定的文件中读取一个数据块到指定的内存缓冲区中,数据块的大小取决于数据块中数据项的大小(字节数)和数据项的项数。该函数的调用格式如下: fread(ptr,size,nitem ,fp) 其中,(read是该函数的函数名,该函数有4个参数分别是:ptr是j个指针,用来指出数据块在内存的起始位置;size表示数据块中每个数据项的大小,以字节为单位;nitem表示数据块中数据项数;fp是一个文件指针,用它指出读取数据块的文件。例如,在一台16位机上从某个文件中读取10.个浮点数,放到数组buff中。可写成如下格式: freed (buff,4,100,fp); 或者, fread (buff,siaeofffloat).lO0(fp); 显然,后一种格式也适用于32位机。 该函数正常时返回实际读取的数据项数,非正常时返回O. (2)数据块的写函数fwrite() 该函数的功能是将指定的内存缓冲区中的数据块中所有数据项写到所指定的文件中。所写数据块的大小是由数据块中数据项的大小和项数决定的。该函数的调用格式如下所示: fwrite (ptr,size,nitem,fp); 其中。(write是该函数的名字,它有4个参数,每个参数的含意与fread ()函数参数相同。该函数就是将由ptr所指向缓冲区内的nitem个数据项(每个数据项为size个字节)的数据块写到由如所指向的文件中。该函数正常返回实际写入文件的数据项数。 4.一般文件的格式读写函数 (3)一般文件的格式读函数fscanf ( ) 该函数的功能是按指定的格式从一个指定的文件中读取数据。给该函数参数表中各变址赋值。该函数的调用格式如下: fscanf(fp,(控制串),(参数表) 其中,fscanf是该函数的文件名,该函数中的参数除了fp是一个被打开文件的文件指针外,其余参数与 scanf()完全相同。该函数与标准格式读函数的区别仅在于前者是从指定的某个文件中读取数据,而后者是从键盘上读取数据。如果将该函数中的fp指定为stdin,则它与scanf()函数是等同的。 (2)一般文件的格式写函数fprintf ( ) 该函数的功能是按指定的格式将该函数参数表中给定的表达式的值写到指定的文件中。调用格式如下所示: fprint(fp), (控制串),(参数表) 其中,f printf是该函数的名字,该函数的参数中除了fp是某个文件的指针外。其余参数与标准格式写函数printf ( )函数完全相同。fp是该函数要写入数据的文件指针,如果fp为stdout则该函数printf ( )函数等同。因此,该函数与printf ( )函数的区别仅在于前者是将数据写到指定的某个文件中,而后者将数据写到显示屏幕上。例如。已知int a = 34;float b=56.78; 而语句 fprintf (fp,%d,%8.2f,a,b); 将变量a的值按%d格式,将变量b的值按%8. 2f格式写到由fp文件指针所指向的文件中。于是fp所指向的磁盘文件上便有如下格式的字符串: 34,56, 78 还可以使用fscanf ( )数将某个磁盘文件上的土述字符串读出,并赋值给两个变量,使用的函数格式如下: fscanf (fp,%d,%f ,&a,&b); 这时,该函数将从fp文件指针所指向的文件读出3-) 给变量a,y出56. 7$给变量b 使用上面讲述的两个函数fscanf ( )和印rintf ()对磁盘文件读写是很方便的,但是由于这两个函数在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换为ASCII码,这样要花费一些转换时间,而使用freaci()和fwrite ( )函数就不需要进行这种转换所以在频繁交换数据的情况下,还是使用fread ( )和(write ( )好些,C语言基础教程 10.3.3 文件定位函数及其使用 文件定位函数包含有定位读写指针函数、归位读写指针函数和返回读写指针函数等。这里的读写指针是指当打开一个文件时系统自动建立一个标识文件中当前字符位置的指针,该指针随着对文件的读写操作而不断的移动。例如,为厂读一个文件而将该文件打开,这时读写指针指在文件头,随着该文件中的字符不断被读出读写指针将向文件尾方向移动,该文件全部读完,则读写指针指向文件尾。读写指针不同于文件指针,读者要将二者区分开。 1.定位读写指针函数fseek ( ) 该函数的功能是将文件的读写指针从某个位置移到指定的位置,该函数将为C语言对文件的随机读写提供了方法。该函数调用格式如下: fseek(fp, f偏移量),(起始位置) 其中,fseek是该函数的函数名;fp是指向被操作文件的文件指针;偏移量)是表示移动当前读写指针的距离量,该参数的类型为long int型;起始位置)是偏移量的相对位置。例如,起始位置为文件头,偏移量为50,则表示将读写指针移到相对文件头距离为50个字节的位置。起始位置的设置方法有三; 0表示相对于文件头 1表示相对于文件的当前位置 2表示祖对于文件尾 实际中,常用宏定义来替代起始位置,规定如下: SEEK_SEC表示文件头 SEEK_CUR表示当前位置 SEEK_END表示文件尾 例如: fseek(fp,200L,0);将读写指针移到离文件头20.个字节处。 fseek(fp, 80L,1);将读写指针移到离当前位置80个字节处。 fseek (fp , -50L,0);将读写指针移到从文件尾向后退50个字节处。 该函数一般用于二进制文件。如果用于文本文件要发生字符转换,计算位置时会发生误差。 2.归位读写指针函数rewind () 该函数的功能是将某个文件的读写指针归位于文件头。该函数的调用格式如下: rewind(fp) 其中,rewind是该函数的函数名,fp是被操作文件的文件指针。使用该函数后,会使被操作文件的读写指针指向文件头。该函数的功能与下列函数功能相同。 (seek (fp,OL.0); 3.返回读写指针函数ftell ( ) 该函数的功能是返回指定文件当前读写指针的位置,该位置是用相对于文件头所相隔的字节数来表示。例如,该函数返回某个文件的当前读写指针的位置是100字节,即表示当前读写指针在离文件头有100个字节处。该函数调用格式如下: ftell(fp) 它返回一个表示字节数的long int型数值。 例10.15 建立一个数据文件,随机读取其中的某个数据。 使用fprintf( )函数建立一个数据文件xy. dat ,然后,指定从某个数据起连续读出若干个数据,最后,再读出这组数据的起始数据。 程序内容如下:#inciude main ( )int i,x,y;FLLE * fp;fp=fopen(xy. dat ,wb十rb);for (i=O;i20;i+)fprintf (fp,%5d,i+1);printf(nlnput x:).scanf(%d&x),for(i=o;i5:i十十)fseek(fp, (long) (5*(x一l+i),0);fscanf (fp ,%d,&y);printf(%dt,y).fseek(fp,(Iong)(5*x一5),0):fscan(fp,%d,&c ),printf(n%dn,&x);fclose(fp); 执行该程序运行结果如下: Input x:10 10 11 12 13 14 lo 说明:该程序先打开一个文件xy.dat,以二进制数的读写方式,用for循环方法向文件中写入20个整型数,这里使用的是fprintf()函数。再从键盘上键入一个数值赋给x,表示从文件中第x个数据项开始读取数据,并将它显示在屏幕上。本程序中,指定从第1O个数据项开始,连续读出5个数据项,暂存在变量Y中,输出到显示屏幕上,这里使用fseek ( )函数进行定位,让读写指针移到第1o个数据项,并从该数据项开始输出。程序中又使用(seek ( )函数重新定位读写指针,使它再指向第1o个数据项,再读取该数据,输出显示为10. 例10.16 编写一个程序使用frell ( )函数估算一个文件的大小。#include main ()long i;FILE*fp;if(fp=fopen(ab,txt ,r)=NULL)printf(File cant open.n);exit(1);(fseek(fp,OL,2):i=ftell(fp);printf(file size;%ldn,i); 执行该程序输出结果如下。 file size: 20 说明:该

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论