第19章输入输出流.ppt

上传人:本田雅阁 文档编号:2251397 上传时间:2019-03-11 格式:PPT 页数:50 大小:408.01KB
返回 下载 相关 举报
第19章输入输出流.ppt_第1页
第1页 / 共50页
第19章输入输出流.ppt_第2页
第2页 / 共50页
第19章输入输出流.ppt_第3页
第3页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第19章输入输出流.ppt》由会员分享,可在线阅读,更多相关《第19章输入输出流.ppt(50页珍藏版)》请在三一文库上搜索。

1、第19章 I/O流,19.1 概述 19.2 标准流类 19.3 标准输入输出流 19.3 文件操作与文件流 19.4 字符串流 19.5 输入输出重载,在C语言中,用printf和scanf进行输入输出,往往不能保证所输入输出的数据是可靠的、安全的。 在C+的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C+的I/O操作是类型安全(type safe)的。 C+的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C+对标准类型的数据和对用户声明类型数据的输入输出,采用同样的方法处理。 C+通过I/O类库来实现丰

2、富的I/O功能。C+的输入输出优于C语言中的printf和scanf,但是比较复杂,要掌握许多细节。,19.1 C+的输入和输出,在C+中,输入输出流被定义为类。C+的I/O库中的类称为流类(stream class)。用流类定义的对象称为流对象。 cout和cin并不是C+语言中提供的语句,它们是iostream类的对象,在未学习类和对象时,在不致引起误解的前提下,为叙述方便,把它们称为cout语句和cin语句。 在学习了类和对象后,我们对C+的输入输出应当有更深刻的认识。,1. iostream类库中有关的类 C+编译系统提供了用于输入输出的iostream类库。iostream这个单词是

3、由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。 ios是抽象基类,由它派生出istream类和ostream类,两个类名中第1个字母i和o分别代表输入(input)和输出(output)。istream类支持输入操作,ostream类支持输出操作,iostream类支持输入输出操作。 iostream类是从istream类和ostream类通过多重继承而派生的类。,C+对文件的输入输出需要用ifstream和ofstream类,两个类名中第1个字母i和o分别代表输入和输出,第2个字母f代表文件(file)。ifstream支持对文件

4、的输入操作,ofstream支持对文件的输出操作。类ifstream继承了类istream,类ofstream继承了类ostream,类fstream继承了类iostream。,2. 与iostream类库有关的头文件 iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。可以换一种说法: 头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有 iostream包含了对输入输出流进行操作所需的基本信息。 fstream用于用户管理的文件的I/O操作。 strst

5、ream用于字符串流I/O。 stdiostream用于混合使用C和C+的I/O机制时。 iomanip在使用格式化I/O时应包含此头文件。,cerr和clog作用相似,均为向输出设备(显示器) 输出出错信息。因此用键盘输入时用cin流,向显示器输出时用cout流。向显示器输出出错信息时用cerr和clog流。 在iostream头文件中定义以上4个流对象用以下的形式(以cout为例): ostream cout (stdout); 在定义cout为ostream流类对象时,把标准输出设备stdout作为参数,这样它就与标准输出设备(显示器)联系起来,,4. 在iostream头文件中重载运算

6、符 “”本来在C+中是被定义为左位移运算符和右位移运算符的,由于在iostream头文件中对它们进行了重载,使它们能用作标准类型数据的输入和输出运算符。所以,在用它们的程序中必须用#include命令把iostream包含到程序中。 #include 在istream和ostream类(这两个类都是在iostream中声明的)中分别有一组成员函数对位移运算符“”进行重载,以便能用它输入或输出各种标准数据类型的数据。对于不同的标准数据类型要分别进行重载,如 ostream operator (int );/用于向输出流插入一个int数据 ostream operator (float ); /用

7、于向输出流插入一个float数据,ostream operator ”重载为对以下标准类型的提取运算符: char,signed char,unsigned char,short,unsigned short,int,unsigned int,19.2 标准流 19.2.1 cout,cerr和clog流,ostream类定义了3个输出流对象,即cout,cerr,clog。分述如下。 1. cout流对象 cout是console output的缩写,意为在控制台(终端显示器)的输出。 (1) cout不是C+预定义的关键字,它是ostream流类的对象,在iostream中定义。 (2)

8、用“cout”输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型,并根据其类型选择调用与之匹配的运算符重载函数。,(3) cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。 (4) 在iostream中只对“”运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。,2. cerr流对象 cerr流对象是标准错误流。cerr流已被指定为与显示器关联。cerr的作用是向标准错误设备(standard error d

9、evice)输出有关出错信息。cerr与标准输出流cout的作用和用法差不多。但有一点不同: cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。当调试程序时,往往不希望程序运行时的出错信息被送到其他文件,而要求在显示器上及时输出,这时应该用cerr。cerr流中的信息是用户根据需要指定的。 p417 ch19_1.cpp,3. clog流对象 clog流对象也是标准错误流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。区别: cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存

10、放在缓冲区中,缓冲区满后或遇endl时向显示器输出。,19.2.2 格式输出,1. 使用控制符控制输出格式 输出数据的控制符见书中表19-4。 注意,这些控制符是在头文件iomanip中定义的,因而程序中应当包含iomanip。 P422 ch19_5.cpp,2. 用流对象的成员函数控制输出格式 除了可以用控制符来控制输出格式外,还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数见书中表19.4。 流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在

11、引用这些格式标志时要在前面加上类名ios和域运算符“:”。 p423 ch19_6.cpp ch19_7.cpp,19.3.1 cin流,19.3 标准输入流,例 通过测试cin的真值,判断流对象是否处于正常状态。 #include using namespace std; int main( ) float grade; coutgrade)/能从cin流读取数据 if(grade=85) coutgradeGOOD!endl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.endl; return 0; ,运行情

12、况如下: enter grade: 67 enter grade: 89 89 GOOD! enter grade: 56 56 fail! enter grade: 100 100 GOOD! enter grade: Z/键入文件结束符 The end. 如果某次输入的数据为 enter grade: 100/2 输出The end.。 在不同的C+系统下运行此程序,在最后的处理上有些不同。以上是在GCC环境下运行程序的结果,如果在VC+环境下运行此程序,在键入Ctrl+Z时,程序运行马上结束,不输出The end.。,19.3.2 用于字符输入的流成员函数,除了可以用cin输入标准类型的

13、数据外,还可以用istream类流对象的一些成员函数,实现字符的输入。 1. 用get函数读入一个字符 流成员函数get有3种形式: 无参数的,有一个参数的,有3个参数的。 (1) 不带参数的get函数 其调用形式为 cin.get() 用来从指定的输入流中提取一个字符,函数的返回值就是读入的字符。若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File) 。,例 用get函数读入字符。 #include int main( ) int c; coutenter a sentence:endl; while(c=cin.get()!=EOF) cout.put(c);

14、 return 0; 运行情况如下: enter a sentence: I study C+ very hard.(输入一行字符) I study C+ very hard. (输出该行字符) Z(程序结束) C语言中的getchar函数与流成员函数cin.get( )的功能相同,C+保留了C的这种用法。,(2) 有一个参数的get函数 其调用形式为 cin.get(ch) 其作用是从输入流中读取一个字符,赋给字符变量ch。如果读取成功则函数返回非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。例7.6可以改写如下: #include int main( ) char c; cou

15、tenter a sentence:endl; while(cin.get(c) /读取一个字符赋给字符变量c,如果读取成功,cin.get(c)为真 cout.put(c); coutendendl; return 0; ,(3) 有3个参数的get函数 其调用形式为 cin.get(字符数组,字符个数n,终止字符) 或 cin.get(字符指针,字符个数n,终止字符) 其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。

16、再将例7.6改写如下: #include using namespace std; int main( ),char ch20; coutenter a sentence:endl; cin.get(ch,10,n);/指定换行符为终止字符 coutchendl; return 0; 运行情况如下: enter a sentence: I study C+ very hard. I study get函数中第3个参数可以省写,此时默认为n。下面两行等价: cin.get(ch,10,n); cin.get(ch,10); 终止字符也可以用其他字符。如 cin.get(ch,10,x);,2.

17、用成员函数getline函数读入一行字符 getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似。即 cin.getline(字符数组(或字符指针),字符个数n,终止标志字符) 例7.7 用getline函数读入一行字符。 #include using namespace std; int main( ) char ch20; coutch; coutThe string read with cin is:chendl; cin.getline(ch,20,/);/读19个字符或遇/结束 coutThe second part is:chendl; cin.get

18、line(ch,20); /读19个字符或遇/n结束 coutThe third part is:chendl; return 0; ,程序运行情况如下: enter a sentence: I like C+./I study C+./I am happy. The string read with cin is:I The second part is: like C+. The third part is:I study C+./I am h,19.3.3 用流成员函数put输出字符,用于输出单个字符的成员函数put。如 cout.put(a); 调用该函数的结果是在屏幕上显示一个字符a

19、。put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式)。如 cout.put(65+32); 也显示字符a,因为97是字符a的ASCII代码。 可以在一个语句中连续调用put函数。如 cout.put(71).put(79).pu(79).put(68).put(n); 在屏幕上显示GOOD。,例 有一个字符串BASIC,要求把它们按相反的顺序输出。 #include using namespace std; int main( ) char *a=BASIC;/字符指针指向B for(int i=4;i=0;i-) cout.put(*(a+i); /从最后一个字符开始

20、输出 cout.put(n); return 0; 运行时在屏幕上输出: CISAB 还可以用putchar函数输出一个字符。putchar函数是C语言中使用的,在stdio.h头文件中定义。C+保留了这个函数,在iostream头文件中定义。,19.3.4 istream类的其他成员函数,除了以上介绍的用于读取数据的成员函数外,istream类还有其他在输入数据时用得着的一些成员函数。常用的有以下几种: 1. eof 函数 eof是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(表示真),否则为0(假)。,例 逐个读入

21、一行字符,将其中的非空格字符输出。 #include using namespace std; int main( ) char c; while(!cin.eof( )/eof( )为假表示未遇到文件结束符 if(c=cin.get( )!= ) /检查读入的字符是否为空格字符 cout.put(c); return 0; 运行情况如下: C+ is very interesting. C+isveryinteresting. Z(结束),2. peek函数 peek是“观察”的意思,peek函数的作用是观测下一个字符。其调用形式为 c=cin.peek( );cin.peek 函数的返回值

22、是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。,3. putback函数 其调用形式为 cin.putback(ch); 其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。 例7.9 peek函数和putback函数的用法。 #include using namespace std; int main( ) char c20; int ch; coutplease enter a sentence:endl; cin.getline(c,15,/); c

23、outThe first part is:cendl;,ch=cin.peek( );/观看当前字符 coutThe next character(ASCII code) is:chendl; cin.putback(c0); /将I插入到指针所指处 cin.getline(c,15,/); coutThe second part is:cendl; return 0; 运行情况如下: please enter a sentence: I am a boy./ am a student./ The first part is:I am a boy. The next character(ASC

24、II code) is:32(下一个字符是空格) The second part is:I am a student,4. ignore函数 其调用形式为 cin,ignore(n, 终止字符) 函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。如 ighore(5, A)/跳过输入流中5个字符,遇A后就不再跳了 也可以不带参数或只带一个参数。如 ignore( )(n默认值为1,终止字符默认为EOF) 相当于 ignore(1,EOF),例7.10用ignore函数跳过输入流中的字符。 先看不用ignore函数的情况: #include

25、using namespace std; int main( ) char ch20; cin.get(ch,20,/); coutThe first part is:chendl; cin.get(ch,20,/); coutThe second part is:chendl; return 0; 运行结果如下: I like C+./I study C+./I am happy. The first part is:I like C+. The second part is:(字符数组ch中没有从输入流中读取有效字符),19.4 文件操作与文件流,19.4.1 文件流类与文件流对象,文件流

26、是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。 请区分文件流与文件的概念。文件流本身不是文件,而只是以文件为输入输出对象的流。若要对磁盘文件输入输出,就必须通过文件流来实现。,有3个用于文件操作的文件类: (1) ifstream类,它是从istream类派生的。 用来支持从磁盘文件的输入。 (2) ofstream类,它是从ostream类派生的。 用来支持向磁盘文件的输出。 (3) fstream类,它是从iostream类派生的。 用来支持对磁盘文件的输入输出。 要以磁盘文件为对象进

27、行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。 其实在用标准设备为对象的输入输出中,也是要定义流对象的,如cin,cout就是流对象,C+是通过流对象进行输入输出的。,19.4.2文件的打开与关闭,1. 打开磁盘文件 打开文件是指在文件读写之前做必要的准备工作,包括: (1) 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。 (2) 指定文件的工作方式。 以上工作可以通过两种不同的方法实现。 (1) 调用文件流的成员函数open。如 ofstream outfile;/定义ofstream类

28、(输出文件流类)对象outfile outfile.open(f1.dat,ios:out); /使文件流与f1.dat文件建立关联 调用成员函数open的一般形式为,文件流对象.open(磁盘文件名,输入输出方式); 磁盘文件名可以包括路径,如c:newf1.dat,如缺省路径,则默认为当前目录下的文件。 (2) 在定义文件流对象时指定参数 在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如 ostream outfile(f1.dat,ios:out); 一般多用此形式,比较方便。作用与

29、open函数相同。 输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,见书中表19_2。,说明: 新版本的I/O类库中不提供ios:nocreate和ios:noreplace。 每一个打开的文件都有一个文件指针。 可以用“位或”运算符“|”对输入输出方式进行组合。 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。,2. 关闭磁盘文件 在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如 outfile.close( );/将输出文件流所关联的磁盘文件关闭 所谓关闭,实际上是解除该磁盘文件与文

30、件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。如 outfile.open(f2.dat,ios:app|ios:nocreate); 此时文件流outfile与f2.dat建立关联,并指定了f2.dat的工作方式。,P433 ch19_15.prj,19.5 字符串流,字符串流不是以外存文件为输入输出的对象,而以内存中用户定义的字符数组(字符串)为输入输出的对象,即将数据输出到内存中的字符数组,或者从字符数组(字符串)将数据读入。字符串流也称为内存流。 字符串流也有相应的缓冲区

31、,开始时流缓冲区是空的。如果向字符数组存入数据,随着向流插入数据,流缓冲区中的数据不断增加,待缓冲区满了(或遇换行符),一起存入字符数组。如果是从字符数组读数据,先将字符数组中的数据送到流缓冲区,然后从缓冲区中提取数据赋给有关变量。,在字符数组中可以存放字符,也可以存放整数、浮点数以及其他类型的数据。在向字符数组存入数据之前,要先将数据从二进制形式转换为ASCII代码,然后存放在缓冲区,再从缓冲区送到字符数组。从字符数组读数据时,先将字符数组中的数据送到缓冲区,在赋给变量前要先将ASCII代码转换为二进制形式。总之,流缓冲区中的数据格式与字符数组相同。 文件流类有ifstream,ofstre

32、am和fstream,而字符串流类有istrstream,ostrstream和strstream。文件流类和字符串流类都是ostream,istream和iostream类的派生类,因此对它们的操作方法是基本相同的。向内存中的一个字符数组写数据就如同向文件写数据一样,但有3点不同:,(1) 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据。 (2) 字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。 (3) 每个文件的最后都有一个文件结束符,表示文件的结束。而字符串流所关联的字符数组中没有相应的结束标志,用户要指定一个特

33、殊字符作为结束符,在向字符数组写入全部数据后要写入此字符。 字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。即通过调用构造函数来解决此问题。,建立字符串流对象的方法与含义如下: 1. 建立输出字符串流对象 ostrstream类提供的构造函数的原型为 ostrstream:ostrstream(char *buffer,int n,int mode=ios:out); buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同),第3个参数是可选的,默认为ios:out方式。可以用以下语句建立输

34、出字符串流对象并与字符数组建立关联: ostrstream strout(ch1,20); 作用是建立输出字符串流对象strout,并使strout与字符数组ch1关联(通过字符串流将数据输出到字符数组ch1),流缓冲区大小为20。,2. 建立输入字符串流对象 istrstream类提供了两个带参的构造函数,原型为 istrstream:istrstream(char *buffer); istrstream:istrstream(char *buffer,int n); buffer是指向字符数组首元素的指针,用它来初始化流对象(使流对象与字符数组建立关联)。可以用以下语句建立输入字符串流对

35、象: istrstream strin(ch2); 作用是建立输入字符串流对象strin,将字符数组ch2中的全部数据作为输入字符串流的内容。 istrstream strin(ch2,20); 流缓冲区大小为20,因此只将字符数组ch2中的前20个字符作为输入字符串流的内容。,3. 建立输入输出字符串流对象 strstream类提供的构造函数的原型为 strstream:strstream(char *buffer,int n,int mode); 可以用以下语句建立输入输出字符串流对象: strstream strio(ch3,sizeof(ch3),ios:in|ios:out); 作用是建立输入输出字符串流对象,以字符数组ch3为输入输出对象,流缓冲区大小与数组ch3相同。 以上3个字符串流类是在头文件strstream中定义的,因此程序中在用到istrstream, ostrstream和strstream类时应包含头文件strstream(在GCC中,用头文件strstream)。 P420 ch 19.3,浙江工业大学 计算机科学 与技术学院,Thank You !,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1