第十章IO流.ppt
《第十章IO流.ppt》由会员分享,可在线阅读,更多相关《第十章IO流.ppt(52页珍藏版)》请在三一办公上搜索。
1、第十章 I/O流,10.1 C+流库概述,所谓“流”,就是数据从源(数据的生产者)到漏(数据的消费者)的流动。可以把一个流简化地理解为,提供字符的源(称为输入流)或收集字符的漏(称为输出流)。C+流库是C+语言为完成输入/输出工作而预定义的类的集合,这些类构成一个层次结构的系统。streambuf类主要负责缓冲区的处理。图10.1为它们之间的层次关系。,10.1 C+流库概述,图10.1strstreambuf类及其派生类,所谓“流”,就是数据从源(数据的生产者)到漏(数据的消费者)的流动。,10.1 C+流库概述,filebuf类扩充了streambuf类的功能,它能够处理文件。把fileb
2、uf同某个文件的描述字相联系就称为打开这个文件。conbuf类也扩充了streambuf类的功能,它能处理输出,为输出操作提供缓冲区管理。ios类及其派生类为用户提供了使用流类的接口。输出流(ostream)针对系统全部预定义类型重载了输出运算符“”,它提供了流的主要输出操作;文件流(fstreambase)提供了文件流的公共操作;串流(strstreambase)专门处理串流。请参考教材图10.2 ios类及其派生类。,图10.2 ios类及其派生类,10.1 C+流库概述,当开始执行C+程序时,系统将自动打开几个预定义流,用户可以在程序中直接使用它们,它们是:cin,称为标准输入流,缺省时
3、为键。如:int m,n;cinmn;/100 22输入时数据间加以空格 cout,称为标准输出流,缺省时为显示器。如:int x=9;cout“x=“xendl;/x=9 cerr和clog都是ostream_withassign类的对象,称为标准错误输出流,固定关联到 显示器。,#include#include using namespace std;void main()string in_string;/向用户终端写字符串cout in_string;if(in_string.empty()/产生一个错误消息输出到用户终端cerr error:input string is empty
4、!n;else cout hello,in_string!n;,10.2 预定义类型的输入/输出,istream流类相对于系统预定义类型把运算符“”重载为输入运算符;ostream流类相对于系统预定义类型把运算符“”重载为输出运算符。,10.2.1 istream流类,istream类中有如下的主要成员函数:get函数从流中把字符输入到给定的char*,直到遇到分界符、文件结束符或已读完(len-1)个字符为止:istream,getline函数 由于程序员常常忘了在应用get()之前丢弃 换行符n,所以使用成员函数getline()要比get()更好,因为它丢弃换行符n,而不是将其留作ist
5、ream 的下一个字符。getline()的语法与get()的三参数形式相同,(它也返回被调用的istream 对象):istream 它们的功能是,从流中提取给定数目的字符到数组char*中。出错时可以用函数gcount得到实际读入的字符数。下面演示一个使用get,getline 和read读出文件内容的例子。,10.2.1 istream流类,#include#include using namespace std;void main()char ch,c030,c130,*p=abcde fghij klmno pqrst uvwsyz;ofstream tfile(aaa.txt);t
6、file.write(p,strlen(p)+1);/写入文件tfile.close();ifstream in0(aaa.txt);in0c0;/读到第一个空格结束coutc0;/输出到屏幕coutendl;while(in0.good()/从第一个空格开始继续读文件in0.get(ch);/使用get从文件读入if(!ch)break;coutch;/使用cout输出in0.close();coutendl;ifstream in1(aaa.txt);in1.getline(c1,30,r);/使用getline从文件头读到r并舍弃rin1.read(c0,30);/从r之后继续读文件co
7、utc1endlc0endl;,程序输出结果:abcde fghij klmno pqrst uvwsyzabcde fghij klmno pqst uvwsyz,10.2.2 ostream流类,ostream类中有如下主要成员函数:flush函数ostream 它们的功能是向流中输出几个字符,第一个参数指向待输出的字符串。,演示使用write函数和put函数和例子。#include#include using namespace std;void main()char*p=Where are you?;ofstream myfile(aa.txt);myfile.write(p,5);/
8、写入文件cout.write(p,5);/写到屏幕for(char ch=a;ch=z;ch+)myfile.put(ch);/写入文件cout.put(ch);/写到屏幕myfile.put(0);/写入文件结束符myfile.close();,可以直接打开查看文件aa.txt的内容,它与屏幕上显示的内容一样,均为:Whereabcdefghijklmnopqrstuvwxyz,write函数可以将内存数据写入文件。它的第1个参数是char型指针,第2个参数是所要写的字节数。当遇到空字符时并不停止,而且当它遇到代码10时,还会自动扩充为回车换行符。这个函数可以二进制方式写入数据,这时的第1参
9、数需要用char*作强制转换。#include#include using namespace std;void main()int a5=1,2,3,4,5;char*p=Where are you?;ofstream tfile1(aaa.txt);/建立文本文件tfile1.write(p,strlen(p);/写入文本文件ofstream tfile2(aaa.dat,ios:binary);/建立二进制文件tfile2.write(char*)a,sizeof a);/数组名即首地址,char*强制转换tfile1.close();tfile2.close();,输入主要由右移操作符
10、 来支持,例如在下面的程序中从标准输入读入一个int型的值序列并把它放在一个vector 中#include#include using namespace std;void main()vector ivec;int ival;while(cin ival)ivec.push_back(ival);/.子表达式 cin ival从标准输入读入一个整数值,如果成功,则把该值拷贝到ival 中.这个子表达式的结果是左边的istream 对象在这种情况下,即cin 自己.,10.2.3 输入运算符,表达式 while(cin ival)从标准输入读入一个序列,直到cin 为false 为止.有两种
11、情况会使一个istream 对象被计算为false:1、读到文件结束(在这种情况下,我们已经正确地读完文件中所有的值)2、遇到一个无效的值,比如3.14159(小数点是非法的)、1e-1 字符(文字e 是非法的)或者一般的任意字符串文字。在读入一个无效值的情况下,istream 对象被放置到一种错误的状态中,并且对于值的所有读入动作都将停止。,10.2.3 输入运算符,10.2.3 输入运算符,运算符输入预定义类型数据时的注意事项:在缺省情况下,运算符跳过空白符,然后读入与输入变量类型相对应的值。当输入字符串(即,类型为char*的变量)时,运算符“”的作用是跳过空白,读 入以下的非空白字符,
12、直到遇到另一个空白字符为止,并在串尾放一个字符“0”。不同类型的变量一起输入时,系统除了检查是否含有空白符之外,还完成输入数据与变量类型的匹配。输入运算符“”采用左结合方式工作,并返回它的左操作数,因此,可以把多个输入操作组合到一个语句中。,最常用的输出方法是在cout 上应用左移操作符(using namespace std;void main()cout gossipaceous Anna Livian;在用户终端上将输出以下内容:gossipaceous Anna Livia 输出操作符可以接受任何内置数据类型的实参,包括const char*,以及标准库string 和complex
13、类类型。任何表达式包括函数调用,都可以是输出操作符的实参,只要它的计算结果是一个能被输出操作符实例接受的数据类型即可。例如:,10.2.4 输出运算符,#include#include using namespace std;void main()cout The length of ulysses is:t;cout strlen(ulysses);cout n;cout The size of ulysses is:t;cout sizeof(ulysses);cout endl;在用户终端上输出如下内容:The length of ulysses is:7The size of ulys
14、ses is:8endl 是一个ostream 操纵符,它把一个换行符插入到输出流中,然后再刷新ostream 缓冲区.,10.2.4 输出运算符,下面的程序展示了一种令人迷惑的现象,我们的目的是输出pstr 所包含的地址值:#include using namespace std;const char*str=vermeer;void main()const char*pstr=str;cout(const_cast(pstr)编译并运行程序得到了我们所期望的输出:The address of pstr is:0 x116e8,10.2.4 输出运算符,下面是另一个令人迷惑的现象,我们的目的
15、是显示两个值中的较大值:#include using namespace std;inline voidmax_out(int val1,int val2)cout val2)?val1:val2;void main()int ix=10,jx=20;cout The larger of ix;cout,jx is;max_out(ix,jx);cout endl;但是在编译并运行程序后却生成了如下不正确的结果:The larger of 10,20 is 0,10.2.4 输出运算符,问题在于输出操作符的优先级高于条件操作符,所以输出val1 和val2 比较结果的true/false 值.
16、即表达式cout val2)?val1:val2;被计算为(cout val2)?val1:val2;因为val1 不大于val2,所以计算结果为false,它被输出为0.为了改变预定义的操作符优先顺序,整个条件操作符表达式必须被放在括号中cout val2?val1:val2);这次产生了正确的输出The larger of 10,20 is 20,10.2.4 输出运算符,10.2.4 输出运算符,使用输出运算符输出预定义类型数据时的注意事项。输出运算符“”也采用左结合方式工作,并且返回它的左操作数,因此,可以把多个输出操作组合到一个语句中,使用起来很方便。使用输出运算符“”进行输出操作时
17、,不同类型的数据也可以组合在一条语句中,例如上面的例子中就是把整型变量和双精度型变量的输出放在同一条语句中。重载并不能改变运算符的优先级,因此,必须特别注意表达式的求值顺序。,10.3 格式控制,C+语言提供了两种格式控制方法:一种方法是使用ios类中有关格式控制的成员函数;另一种方法是使用称为操纵符的特殊类型的函数。,10.3.1 用ios类成员函数控制格式,用成员函数操作状态标志设置状态标志。ios中定义了用于设置状态标志的成员函数setf,它的原型为:long ios:setf(long flags);清除状态标志。取状态标志。下面举一个综合使用上述三种操作状态标志的成员函数的例子:#i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十 IO
链接地址:https://www.31ppt.com/p-5116058.html