




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++计算机语言教学课件lect09supOutlineIntroduction面向对象的标准库条件状态异常控制输出缓冲区的管理文件的输入输出字符串流格式状态未格式化的输入/输出操作1.IntroductionC++的输入/输出(input/output)由标准库提供标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO)C++支持C语言中所有的输入输出操作,并对其做了大量的优化2.面向对象的标准库问题引入:实际的程序既要支持对控制窗口的IO,也要支持对文件的读写,还应该能方便地使用IO操作格式化内存中的数据,避免读写设备造成的巨大开销支持多种类型的读写,如单字节,宽字节等要解决上面的问题,程序的复杂程度非常高。面向对象的标准库为了管理这种的复杂程度,标准库使用了继承来定义一组面向对象类。IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型fstream定义读写已命名文件的类型sstream定义了读写内存中string对象的类型fstream和sstream都里面定义的每种类型都是从iostream中继承(重写)简单的iostream继承层次ostreamistreamiostreamifstreamifstreamsstringstreamfstreamostringstreamistringstream虚基类IO标准库类型和头文件HeaderTypeiostreamistream从流中读取,如cin,这是内置的输入流对象ostream写到流中去,如cout,这是内置的输出流对象iostream对流进行读写;从istream和ostream派生而来fstreamifstream从文件中读取;由istream派生而来ofstream写到文件中去;由ostream派生而来fstream读写文件;由iostream派生而来sstreamistringstream从string对象中读取;由istream派生而来ostringstream写到string对象中去;由ostream派生而来stringstream对string对象进行读写;由iostream派生而来IO对象不可复制或赋值标准库类型不允许对流对象做复制或赋值操作,这个要求有两层含义:不能把流对象存储在vector等容器中:因为只有支持复制的元素类型才可以存储在vector等容器中,而流对象不支持复制形参或返回类型不能为流类型:如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用例子: ostreamout1=cout; //错误,流对象不能赋值 ostream&out2=cout; //正确,可以使用引用一般情况下,如果需要传递IO对象对它进行读写,则必须使用非const引用,因为对IO对象的读写会改变它的状态输入输出操作符输入(>>)操作符,用于从istream对象中读入输入输出(<<)操作符,用于把输出写到ostream对象中C++标准库中对输入/输出操作符进行了重载,使得他们能够输入/输出内置类型。(类型转换)如:cout<<1; //输出整型 cout<<1.0; //输出浮点数 cout<<‘1’; //输出字符 cout<<“123”; //输出字符串用户可对输入输出操作符进行重载,使得它们能够应用于用户自定义类型支持级联(Cascading):cout<<1<<2;Entergrade(enterend-of-filetoend):67Entergrade(enterend-of-filetoend):87Entergrade(enterend-of-filetoend):73Entergrade(enterend-of-filetoend):95Entergrade(enterend-of-filetoend):34Entergrade(enterend-of-filetoend):99Entergrade(enterend-of-filetoend):^ZHighestgradeis:993.条件状态实现IO的继承是错误发生的根源,一些错误是可恢复,一些错误则发生在系统底层,位于程序可修正的范围之外。IO标准库管理一系列条件状态(conitionstate)成员,用来标记IO所处的状态。
IO标准库的条件状态strm::iostate机器相关的整型名,由各个iostream类定义,用于定义条件状态(??)strm::badbitstrm::iostate类型的值,用于指出被破坏的流strm::failbitstrm::iostate类型的值,用于指出失败的IO操作strm::eofbitstrm::iostate类型的值,用于指出流已经到达文件结束符s.eof()如果设置了流s的eofbit值,则该函数返回true是否达到文件结束s.fail()如果设置了流s的failbit值,则该函数返回trues.bad()如果设置了流s的badbit值,则该函数返回trues.good()如果流s处于有效状态,则该函数返回trues.clear()将流s中的所有状态值都重设为有效状态s.clear(flag)将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostates.setstate(flag)给流s添加指定条件。flag的类型是strm::iostates.rdstate()返回流s的当前条件,返回值类型为strm::iostate条件状态考虑下面例子:
intival; cin>>ival;如果输入Borges,则cin在尝试将输入的字符串读为int型数据失败后,会生成一个错误状态如果输入文件结束符(end-of-file),cin也会进入错误状态如果输入1024,则成功读取,cin将处于正确的无错误状态条件状态流必须处于无错误状态,才能用于输入或输出。检测流是否用的最简单的方法是检查其真值:
if(cin)【类型转换,转成bool】//oktousecin,itisinavalidstatewhile(cin>>word)【输入数据错误则中断】//ok:readoperationsuccessful...if语句直接检查流的状态,而while语句则检测条件表达式返回的流,从而间接地检查了流的状态。?如果成功输入,则条件检测为true。同学们回去可以思考一下,为什么IO对象(如上面的cin)可以直接用于条件判断:上面是输入之前Beforeabadinputoperation:cin.rdstate():0cin.eof():0cin.fail():0cin.bad():0cin.good():1
Expectsaninteger,butenteracharacter:A
Afterabadinputoperation:cin.rdstate():2cin.eof():0cin.fail():1cin.bad():0cin.good():0
Aftercin.clear()cin.fail():0cin.good():14.输出缓冲区的管理每个IO对象管理一个输出缓冲区,用于存储程序读写的数据,如语句:
cout<<“pleaseenteravalue”;系统将字符串字面值存储在cout的缓冲区中,并没有输出到设备或者文件中,如上面的语句并没有马上显示在控制窗口中。缓冲区被刷新的时候,缓冲区中的内容会被写入真实的输出设备或者文件中。??输出缓冲区的刷新下面的几种情况会使得缓冲区被刷新:程序正常结束缓冲区已经满了。在这种情况下,缓冲区将会在写下一个值之前刷新用操纵符显式地刷新缓冲区,例如endl使用unitbuf操作符设置流内部状态将输出流与输入流关联(tie)起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区用操纵符刷新缓冲区C++提供了三个操纵符用于刷新缓冲区:endl:用于输出一个换行符并刷新缓冲区flush:用于刷新流,但不在输出中添加任何字符ends:在缓冲区中插入空字符null,并刷新缓冲区
cout<<“hi!”<<flush; cout<<“hi!”<<ends; cout<<“hi!”<<endl;unitbuf操纵符如果需要刷新所有输出,最好使用unitbuf操纵符。这个操纵符在每次执行完后都刷新流:
cout<<unitbuf<<“first”<<“second”;等价于
cout<<“first”<<flush<<“second”<<flush;若要取消unitbuf的作用可以使用nounitbuf操纵符,它将流恢复为使用正常的、由系统管理的缓冲区刷新方式将输入和输出绑在一起当输入流与输出流绑在一起时,任何读输入流的尝试都将首先刷新其输入流关联的缓冲区。如果将cout与cin绑在一起,语句 cin>>ival;
将导致cout关联的缓冲区被刷新。tie函数可用istream或ostream对象调用,使用一个指向ostream对象的指针形参一个ostream对象每次只能与一个istream对象绑定在一起。如果在调用tie函数时传递实参0,则打破该流上已存在的捆绑。1
2
3
4
5
6
7
8
9
10//将cin跟cout绑在一起cin.tie(&cout);//获得与cin绑定的对象的指针,即指向cout的指针ostream*old_tie=cin.tie();//打破cin跟cout的绑定,读cin时,cout不会被刷新cin.tie(0);//将cin跟cerr绑在一起cin.tie(&cerr);//重新绑定cin跟cout(因为old_tie指向cout)cin.tie(old_tie);5.文件的输入输出fstream头文件中定义了三种支持文件IO的类型:ifstream,由istream派生而来,提供读文件功能ofstream,由ostream派生而来,提供写文件功能fstream,由iostream派生而来,提供读写同一个文件的功能这些类型都有相应的iostream类型派生而来,所以iostream上所有的操作适用于fstream中的类型,同样,前面提到的条件状态也同样适合。文件流对象的使用cin、cout、cerr是标准库定义的对象,可直接使用。当需要读写文件时,必须定义自己的对象,并将它绑定在需要的文件上。
ifstreaminfile(“in.txt”);【若不存在则新建】 ofstreamoutfile(“out.txt”);上述代码定义并打开2个fstream对象。infile是读的流,outfile是写的流。可以使用语句if(infile)来判断是否成功打开文件文件模式每个fstream类都定义了一组表示不同模式的值,用于指定流打开的不同模式。下表列出了文件模式及其含义:in打开文件做读操作out打开文件做写操作app在每次写之前找到文件尾ate打开文件后立即将文件定位在文件尾trunc打开文件时清空已存在的文件流binary以二进制模式进行IO操作文件模式out、trunc和app模式只能用于指定与ofstream或fstream对象关联的文件in模式只能用于指定与ifstream或fstream对象关联的文件所有文件都可以用ate或binary模式打开//使用默认打开方式,即out和trunc模式,会清空文件file1ofstreamout1(“file1”)会清空//使用模式out和trunc打开file1ofstreamout2(“file1”,ofstream::out|ofstream::trunc)//使用app模式打开file1,保存文件的数据并在最后添加数据ofstreamout3(“file1”,ofstream::app)6.字符串流头文件sstream包含三种类型的字符串流:istringstream,由istream派生而来,提供读string功能ostringstream,由ostream派生而来,提供写string功能stringstream,由iostream派生而来,提供读写string的功能与fstream类型一样,上诉类型由iostream派生而来,所以iostream上所有的操作都适用stringstream特定的操作stringstreamstrm;创建自由的stringstream对象stringstream
strm(s);创建存储s的副本的stringstream对象,其中s是string类型的对象strm.str();返回strm中存储的string类型对象strm.str(s);将string类型的s复制给strm,返回voidstringstream中类中存有一个string对象,对stringstream的读写操作实际上是对该对象中的string对象进行读写1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
202122#include<string>#include<iostream>#include<sstream>intmain(){//constructsastringstreamobjectwithanempty//sequenceascontent.std::stringstreamss;//writedatatothebufferofstringstreamobjectss<<100<<''<<200;intfoo,bar;//readdatafromthebufferofstringstreamobjectss>>foo>>bar;std::cout<<"foo:"<<foo<<'\n';std::cout<<"bar:"<<bar<<'\n';return0;}outputfoo:100bar:2007.格式状态除了条件状态外,每个iostream对象还位置一个控制IO格式化细节的格式状态格式状态控制格式化特征,包括:输出元素的宽度浮点数的的格式,如精度、记数法等整型值的基数,如十进制、十六进制等其他一些格式化特征标准库定义了一组操纵符来修改对象的格式状态iostream中定义的操纵符(1)boolalpha将真和假显示为字符串xnoboolalpha将真和假显示为1,0showbase产生指出数的基数的前缀
xnoshowbase不产生记数基数前缀showpoint总是显示小数点xnoshowpoint有小数部分才显示小数点showpos显示非负数中的+xnoshowpos不显示非负数中的+uppercase在十六进制中打印0X,科学记数法中打印Exnouppercase在十六进制中打印0x,科学记数法中打印exdec用十进制显示hex用十六进制显示oct用八进制显示left在值的右边增加填充字符right在值的左边增加填充字符注:带x的是默认流状态iostream中定义的操纵符(2)internal在符号和值之间增加填充字符fixed用小数形式显示浮点数scientific用科学记数法显示浮点数flush刷新ostream缓冲区ends插入空字符,然后刷新ostream缓冲区endl插入换行符,然后刷新ostream缓冲区unitbuf在每个输出操作之后刷新缓冲区xnounitbuf恢复常规缓冲区刷新xskipws为输入操作符跳过空白noskipws不为输入操作符跳过空白ws“吃掉”空白注:带x的是默认流状态iomanip中定义的操纵符setfill(ch)用ch填充空白setprecision(n)将浮点精度置为0setw(w)读写w个字符的值setbase(b)按基数b输出整数
读写操纵符的时候,不读写数据,相反,会采取某种行动。如前面使用过的一个操纵符endl,我们将它“写至输出流”,就好像它是一个值一样,但endl并不是一个值,相反,它执行一个操作:写换行符并刷新缓冲区例子:指定输出的基数Enteradecimalnumber:2020inhexadecimalis:1420inoctalis:2420indecimalis:20例子:指定显示的精度Squarerootof2withprecisions0-9.Precisionsetbytheprecisionmemberfunction:11.41.411.4141.41421.414211.4142141.41421361.414213561.414213562
Precisionsetbythesetprecisionmanipulator:11.41.411.4141.41421.414211.4142141.41421361.414213561.414213562Enterasentence:ThisisatestofthewidthmemberfunctionThisisatestofthewidthmemberfunction例子:控制输出的宽度8.未格式化的输入/输出操作迄今为止,示例程序只使用过格式化的IO操作,输入输出操作符根据处理数据的类型格式化所读写的数据。标准库中还提供了丰富的支持未格式化IO的低级操作,这些操作使我们能够将流作为未解释的字节序列处理,而不是作为数据类型(如char、int、string等)的序列处理单字节低级IO操作is.get(ch)将istreamis的下一个字节放入ch,返回isos.put(ch)将字符ch放入ostream,返回osis.get()返回is的下一字节作为一个int值is.putback(ch)将字符ch放回is,返回isis.unget()将is退回一个字节,返回isis.peek()将下一字节作为int值返回但不移出它上述表格中的未格式化的操作一次一个字节地处理流,它们不忽略空白地读Beforeinput,cin.eof()is0Enterasentence
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度企业财产一切险保险合同范本
- 2025年度购房合同转让及物业移交管理服务协议
- 2025年度新能源企业员工聘用创新合同
- 二零二五年度艺人网络文学改编签约协议
- 2025年度购房公积金提取合同解除书
- 2025年度智能空调清洗与节能改造服务合同
- 二零二五年度电商直播带货渠道代理合作协议
- 二零二五年度新型环保材料研发中心厂房租赁合同终止协议
- 二零二五年度委托中介出售手房并支持分期付款合同
- 二零二五年度房屋买卖合同定金返还纠纷诉状
- 高新技术企业认定申请书样例与说明
- 数据结构英文教学课件:chapter6 Tree
- 高压氧科工作总结高压氧科个人年终总结.doc
- 《政治学概论》教学大纲
- 桥梁缺陷与预防
- 食品生物化学习题谢达平(动态)
- 新苏教版小学科学三年级下册全册教案(2022年春修订)
- 保安员工入职登记表
- 睿达RDCAM激光雕刻切割软件V5.0操作说明书
- 机械设计基础平面连杆机构课件
- 人力资源部经理岗位说明书
评论
0/150
提交评论