c语言基础教程 第十章 文件和读写函数doc.docx
- 文档编号:30077317
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:32
- 大小:34.03KB
c语言基础教程 第十章 文件和读写函数doc.docx
《c语言基础教程 第十章 文件和读写函数doc.docx》由会员分享,可在线阅读,更多相关《c语言基础教程 第十章 文件和读写函数doc.docx(32页珍藏版)》请在冰豆网上搜索。
c语言基础教程第十章文件和读写函数doc
C语言基础教程10.1.1文件和文件指针
1.文件
一般说來,文件是有序数据的集合。
程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。
文件是被存放在外部存储设备中的信息。
対文件的处理过程就是面向文件的输入和输出过程。
文件的输入过程是从文件中读出信息,文件的输出过程是往文件屮写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。
文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅來讲述文件的读写函数。
C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息〃流〃或看成是一-个字符流(文本文件),或看成是i个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。
任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。
C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。
将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件n
C语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。
文本文件是按一个字节存放一个字符的ASCII码來存放的;二进制文件是按数据在内存屮的存储形式放到磁盘上的。
例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。
两种存放方式各有利弊。
以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空I'可较多,并且要花费转换吋问。
以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。
2.文件指针
文件指针是一种用來指向某个文件的指针。
如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存屮的缓冲区的首地址。
每一个被使用的文件都要在内存屮开辟一个区域,用來存放的有关信息,包括文件名字、文件状态和文件当前位宜筹。
这些信息被保存在一个结构变量屮,该结构变量所对应结构模式被系统定义为FILE,它被放在,stdioh文件屮。
有些版式的FILE被定义如下:
typestruct
{
/*文件号*/
/*缓冲区内剩余的字符*、
/文件操作模式*/
/*下一.个字符位宜*/
intfd;
intcleft
intmode;
char*mexic;
}FILE;
在文件操作的程序中,要使用FILE来定义文件指针,并且将打开的文件缓冲区的首地址赋给文件指针,让它指向该文件。
例如
FILE:
*FP;
其中,fp是一个指向文件的指针。
fp,fOpen("ahc.txr","r"):
给fp赋值,使它指向abc,txt文件。
于是。
fp便是一个指向abc.txt文件的指针。
有了文件指针以后,对'文件的操作(读、写和关闭等)都使用文件指针,而不使用文件名。
3.读写
读写指针当一个文件被打开后用来标识读写文件位置的。
它与文件指针是不同的。
文件指针一旦被指向某个文件。
它的值是不会改变的,直到该文件被关闭为止。
而读写指针是当某个文件被打环时,它指向文件头或文件尾(与打开方式有关),对以通过定位畅数(fseek()来改变读写指针的位置。
对见,读写指针与文件指针是两个完全不同的概念,在使川时应注意分清。
关于指针的详细描述,在本章后面讲述文件定位函数时还会讲到。
C语言基础教程10.1.2标准文件和一般文件
1.标准文件
C语言屮规定的标准文件一有三个,它们分别是标准输入文件(键盘)、标准输出文件(显示屏幕)和标准出错信息文件,规定错谋信息显示在屏幕上。
这二个文件的文件指针分别为标准输入文件是Stdin,标准输出文件是stdout,标准出错信息文件是stderro
标准文件的特点是这类文件使用前不必打开,使用后不必关闭。
因为系统将它在启动系统时白动打开。
在退出系统吋白动关闭,并且H动为这三个标准文件分配缓冲区,指定文件指针。
因此,使用标准文件十分方便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(〃{控制串),(参数表)〃)
该两数有关参数说明在第一章屮已经讲述过了。
卜面仅作两点补充。
一是在(控制串)屮除了格式符外,还可用除空格符以外的一般字符,一般字符作为匹配符。
所谓匹配符是川來确定输入数据流中愉入项的。
在控制串屮使川•般字符作为匹配符时。
输入数据流屮要有与匹配符对应的字符来区分数据流屮的输入项。
例如,控制串屮出现匹配符逗号(,),则在输入流屮要以逗号来分隔输入项,要求控制串屮出现的匹配符要与输入流中出现的分隔符一致,即字符相同,次数相等。
Ua:
屮用来区分输入流的数据输入项的方法有三;一是前面讲述的川匹配符的办法;二是在格式符屮加最人域宽的修饰符;三是使用默认的输入项分隔符-空片符,这时控制串屮不加任何其他字符。
二是在控制串屮,格式符里%与格式说明符之间对以加如I、•修饰符:
(1)数字。
用來表示最大的域宽。
如果输入流屮数据位数超过最人域宽,则只取最人域宽的位数,其后舍去;如果输入流数据位数不足最人域宽,则按实际宽度读取。
(2)!
字符,!
字符用在表示int型数的格式符d.o,x前面,表示长整型;用在格武符f前面表示双精度浮点数。
(3)h字符。
h字符只可用在表示int型数的格式符d,o,x前面,表示shortint型。
(4)*字符。
这是一个抑制符,表示跳过关芾而整数所指岀的输入域宽,如果没有表示跳过的整数域宽,则跳过一个输入域'到下一个空白符。
[例10.1]分析下列程序的输出结朱。
注意标准格式输入函数的使用。
main()inta.b,c;
prinrf(HEnyerabcn);
scant(,,%2d%,*%3d,3d%4d,\&a,&b,&c);
printf("a-%d,b-%d,c-%d\nn,a,b,c
执行该程序输出如卜信息:
Enterabc:
1234567890
输出结果如卜:
a二12,b二67&c=90
说明:
该例屮,scanf()函数屮格式符里使用了数字来规定输入项的最大宽度,并川星号符来抑制某些输入项:
该控制串中各格式符的规定说明如F:
将前2位整数赋值给变量a,然后跳过3位密数,再将3位整数读取给变量b,最后还剩F2位数读取给变最c,变量c对应的输入最大宽度为4位,不足4位有儿位取儿位。
在实际应川屮,常川抑制符来跳过不想输入的数据项。
(2)标准格式输出函数pr}ntf
该函数的格式如F:
printfC(控制串)(参数表))
该函数有关参数说明在第一章屮已经讲述过了。
下面再作两点补充。
一是在〈控制串)的格式符屮,可以在%与格式说明之间加修饰符。
该修饰符主要是川来指定输出数据项的宽度。
常用的修饰符如卜所述:
(1)数字。
数字。
小数点前的数字表示输出数据项的最小域宽,当实际输出数据项的宽度小于最小域宽时,按最小域宽输出。
在右对齐的格式卜,前面补空格符;当实际输出数据项的宽度人于最小域宽时,按实际宽度输出。
小数点后面的数字表示输出数据项的精度。
对浮点来讲,表示小数的位数;对字符串來讲,表示字符申屮字符的最多个数;对整数來讲,表示输出项的最多位数。
(2)负号一。
负号用來表示输出数据项屮的字符左对齐,没有负号时为右对齐。
一般情况卜,左对齐,右边补空格符;右对齐。
左边补空格符。
(3)1字符。
1字符用于表示int型数的格式符d,0,x的前面,表示长整型;用于格式符f的前面。
表示双精度浮点数:
(4)0字符。
0字符用于右对齐格式屮替换数据项左边的空格符。
(5)*字符。
*符川来通过变童的值指定域宽的。
*字符要在输出数据项的参数表屮对应一个表达式。
该表达式的值为该输出项的宽度。
[例10.2]分析下列程序的输出结果。
注意prinft()数屮可变域宽和补0的应丿IJ。
main()
inti=5;
floatx-12.345678;
printf(K%*.3f\nn,i,x);
printf("%()lc,
printf(”%0*卢f\n”,l6,i,x);
执行该程序运行结果如h■:
12.316
0012.34568
00012.34568
说明:
(1〉在控制串〃%*•3f\『屮,养对应的表示域宽的变量为参数表屮的i.i值为5,则控制串相当于〃%5.3f\『.该格式要求小数取3位,该数值婕数有2位。
加1位小数点,共6位,大于指定的最小域宽5,于是按实际宽度输出,最后一位四舍五入。
(2)在控制串〃甑)10.*f\n'屮,*对应的表示小数位数的变量为参数表屮的1,即5格式屮指定最小域宽为10.并且数据前面补的空格符用0替换。
输出数据有2位格数,5位小数,再加1位小数点,共8位,因此数据前还应有2个0.
(3)在控制串〃%o.*f/n〃屮、第一•个*对应的表示最小域宽的变量为参数表屮i+6表达式,其值为11,第二个*对应的表示小数位数的变量为参数表屮的i,即5.格式屮乂指定用0替换数据前填补的空格符。
因此,输岀结果为00012.345680o
二是printf()两数也有一个返回值,该值是表示输出函数所输出的所有数据项所占的总宽度。
[例10.3]分析下列程序输出结果。
注意分析printf()函数的返回值。
main()
{
inta,b,c;
a=100;
b=256;
c=printf(H%05d,%05d\n”,a,b);
printfT%d\n”,c);
)
执行该程序输出结果如K
00100,00256
12
说明:
程序中变量c是用来存放printf()函数的返回值的。
该函数的实际输出宽度是a,b变量各5位,逗号1位,换行符1位,共12位。
C语言基础教程1022标准文件的读写函数应用
标准文件的读写函数在c语汗程序屮有着广泛的应用,因此熟练地芈握这吐函数是十分重要的。
特别是scanf()和printf()函数应用更多,而它们还有一定的复杂性,在应用中更应特别注意。
下面讲述这些函数在使用中应该注意的一些事项。
(1)由于getch()函数是带有缓冲区的,使用吋应注意缓冲区剩余字符对后面输入函数的影响。
[例10.4]分析下列程序的输出结果。
#include
main()
{
inti.j,k;
printf(”Enter1character:
“);
i=getchar();,
printf(M%C\nn,i);
printf("Enter!
character;");
j=getchar();
printf(nEnter1character:
n);
k=getchar()o
printf(”%c,%c\n”,j,k);
}
执行该程序后,显示如卜信息:
Enter1character:
a
健入字符a和冋车后,输出如下信息:
a
Enter1character:
Enter1character:
b
健入字符b和冋车后,输出如下信息:
.b
说明:
该程序中使用getchar()函数从键盘中接收到字符,当在"Enter1charade;"提示信息后输入a后,则输出信息如上所示,其原因是因为键入的实际是两个字符,a字符和冋车符。
将a字符送给变量i.将冋车符送给了变衆j,因此第二个"Enter1character:
,z提示则不需要再输入字符,于是出了第三个"Enter1character"提示,当键入b了后,输出结果告诉我们,i变量屮的字符的确是冋车符,因为在输出,b字符之前空了一行,而k变量的字符为b.为了实现每个提示信息都要输入一个字符送给相应的变量,就需要及时消除缓冲区内多余的字符。
例如,键入a了后,缓冲区屮有两个字符,a是有用的,冋车符是多余,于是要将多余的冋车符消除,否则它将影响厉面的继续输入。
其办法对川getchar()函数来吃掉一个字符。
上述程序可作如下修改。
#include
main()
{
inti,j,k;
printf(MEnter1character:
");
i=getchar();
getchar();
pnnif(n%c\nn,i);
printf(uEnterIcharacter/1);
j=getchar();
getrhar();
printf(HEnter1character:
);
k=getchar();
printf(”%c,%c\rT,j,k)
}
执行该程序市场如下信息;
EnterIcharacter:
a
a
EnterIcharacter:
b
EnterIcharacter:
C
b,c
执行该程序市场如卜信息;
Enter1character:
a
a
Enter1character:
b
Enter1character:
C
b,c
说明:
该程序屮增加了两条getchar();语句,其目的是为了消除缓冲区屮剩余的无用字符,使程序得以正常进行-。
该程序中,由于缓冲区屮只有一个多余字符,因此使用一次getchar()函数,如果缓冲区中有多个剩余字符乂该怎办呢?
请读者思考。
(2)标准格式输入函数scan()也是带缓冲区的,它也存在有剩余字符的及时处理问题。
[例10.5]分析卜•列程序输出结果.注意由于scanf()函数是带缓冲区的所产生的影
响。
main()
charslf101,s2[10];
printf("Inputastring:
”);
scanf("%4s",sl);
printf(',sl,%s\n,',sl);
printfC'Inputastring/1);
scanf("%s",s2);
}
执行该程序显示如下信息:
Iinputastring:
abcdef
si:
abed
Inputastring:
s2:
ef
执行该程序显示如卜信息:
Iinputastring:
abcdef
si:
abed
Inputastring:
s2:
ef
说明:
出现上述输出结果是因为键人abcdef加冋车键厉,字符数组S1接受4个字符abed,
并自动加上字符串结束符。
这时字符串缓冲区屮还有ed和换行符。
程序屮输出显示si厉,屏幕出现卜一个,"Inputastring;"提示信息,由于缓冲区还有剩余字符,则不再需要键盘输人信息。
而自动将缓冲区剩余字符ef赋给字符数组s2•出现s2:
ef的结果。
为了及时清除缓冲区屮的剩余字符,叮在下一•次使用scanf()之前,用下述方法清除缓冲区屮的剩余字符:
while(getchar());
(3)在scanf()函数屮,%c与触这种格武的区别主要表现在如卜两个方面:
一•是字符格式时变量只接收一个字符;而字符串格式时除接收规定的字符外,还自动加'\0',二是字符格式时,遇到字符包含空格符都作为字符输入;而字符串格式时,非空格符前边的前导空格被略去,不作为字符输入,而从非空格符开始进行输入。
[例10.6]分析F列程序的输出结果。
注意格式符眈与%$的区别。
main()
{
chars[l=H1234567";
printf(nInputs:
”);
scanf("%4c",s);
printf(”s:
%s\n”,s);
printf("Inputs:
”);
scanf("%4s",s);
printf(ns;%s\n\s);
}
执行该程序输入如卜信息:
Inputs:
ab
s:
ab567
Inputs:
ab
s:
ab
说明;该程序屮输人两个相同的字符串,但是输出结果却不同,其原因在于scanf()函数屮两次所用的格式符不同,-诙丿IJ%4c,另一次使用%4s・于是,该程序的输出结果将十分清楚告诉我们,紅和%s,这两种格式的区别,详细情况请读者白行分析。
(4)scanf()函数在正常情况卜,它的参数表屮的每个参数都能获得指定的数值,但在非正常情况,当某个参数所斌了的值与其指定的格式相才盾时,则结束整个的输入,seem(O函数屮厉面的参数将没有被赋值。
[例10.7]分析下列程序的输出结果。
注意scanf()函数的返回值和各变量的输出结果。
main()
inta,n
charb;
floatc;
n=scanf("%3d%c%f',&a,&b,&c);
printf(n%d\n”,n);
printf("%d,%c,%f\nn,a,b,C);
}
当输入信息流如卜所示:
123a146.78
这时的输出结果如何呢?
有人认为输出结果应该如卜所示:
3
123.a.16.78000
可见,实际上的输出结果并非如此,为什么呢?
请读者自己分析,并上机验证。
如果将输入信息流改为下述情况:
123a46.78
结果乂将回怎么样呢?
进一步加深对紅格式的认识。
(5)在实际中字符串的输入和输出可以使用gets()和put()函数比较方便。
【例10.8】分析F列程序的输出结果。
注意gets()和puts()函数的使用方法;mxin()
{
charsl[101,s2[10];
printf('Inputastring:
")
gets(si);
puts(si);
printf("Inputastring:
”)
gPtS(S2);
puts(s2);
执行该程序显示如下信息:
Inputastring:
ahcde
abede
Inputastring:
xyxmn
xyzmn
说明:
该程序屮使用gets()函数从键盘一上接收一•个字符串,使用puts()函数将该字符目输出到屏幕上显示,使用起来十分方便。
实际屮也可用gets()函数接收一个柴型数,然后用atoi()函数将它转换成整型数。
C语言基础教程10.3.1打开文件函数和关闭文件函
一般文件在对它进行读写操作之前需要打开,打开文件函数格式如下:
fp=fopenC(文件名)",(打开方式))
其中,fopen是打开文件函数的名字,该函数有两个参数,一个是(文件名),该参数是一个字符串,需用双撇号(")括起,文件名要全一名,即包含路径名和扩展名。
另一个是(打开方式),它也要用双撇号括起。
打开方式的选择如下所示:
r
表示读方式
w:
表示写方式
a:
表示追加写方式
r十
rb:
W:
表示读写方式,也可写成匸十表示二进制文件读方式
wb:
表示二进制文件写方式
ab;表示二进制文件追加写方式
br+:
表示二进制文件读写方式
该函数如果成功地打开了指定的文件,则返冋该文件的内存缓冲区的甘地址,将它赋给一个被定义为文件指针的变量,于是该指针将指向这个被打开的。
文件,直到被关闭为止;如果该两数没有成功地打开文件,则返冋值为NULL.因此,在执行打开文件的操作厉,总要判断一卜•返冋值是否为NULL,如果返回值为NULL,则说明文件打开失败,一•般应退出该程序,检查失败的原因。
因此,常用如厂程序段来对没有打开文件进行处理:
if(fp=NULL)
)
printf("filecan'topen!
\n"):
exit
(1);
其中,fp是文件指针,用它來接收fopen()函数的返冋值。
exit()是。
个退出当前的执行的程序的函数,当文件没有被打开时,一般应退出程序。
两数只有被成功的打开后才可以对它进行读写操作。
一旦文件的读写操作完成厉,应该及时地将它关闭。
关闭文件函数的格式如F:
fclo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言基础教程 第十章 文件和读写函数doc 语言 基础教程 第十 文件 读写 函数 doc