您好,欢迎访问三七文档
第十一章流类库与输入/输出C++语言程序设计C++语言程序设计2本章主要内容I/O流的概念预定义的标准流与提取和插入运算符使用I/O成员函数输入流文件流C++语言程序设计3概述输入/输出(input/output)是指程序与计算机的外部设备之间进行信息交换。输入操作:指从指定设备收取一个字符序列。输出操作:将一个对象转换为一个字符序列,输出到某一个设备。输入输出操作:可以看成是字符序列在源和目的之间的流动。将执行这个输入/输出操作的类体系称为流类,提供这个流类实现的系统称为流类库。C++语言程序设计4在C++中,没有专门的输入/输出语句,为了方便用户灵活地完成输入/输出,C++提供了功能强大的输入/输出流类库。C++的I/O系统为了向程序员提供一个统一的接口,使程序的设计尽可能地与所访问的具体设计无关,在程序员与被使用的设备之间提供一个抽象的概念-------流。C++语言程序设计5I/O流的概念当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。读操作在流数据抽象中被称为(从流中获取)提取,写操作被称为(向流中添加)插入。C++语言程序设计6使用流的优点(与printf,scanf比较)(1)可以用其严格的类型检查机制,减少因使用不当引起的程序错误;(2)流是面向对象的,可以利用类的继承性和多态性,给用户提供统一的接口,实现更多的功能。C++语言程序设计7基本流类体系iosstreambufistreamostreamiostreamC++语言程序设计8C++中的流类体系在头文件“iostream.h”中作了说明。类ios是类istream和类ostream的虚基类。streambuf不是ios类的派生类,类ios中有一个指针成员指向类streambuf的一个对象。类streambuf是用来管理一个流的缓冲区。类iostream是类istream和类ostream的公有派生。C++语言程序设计9注:系统在主存中开辟一个专用的内存区域用来临时存放输入/输出信息,这种内存区域称为缓冲区。输入/输出流可以是缓冲的,也可以是非缓冲的。引入缓冲的目的是为了提高系统的效率。通常情况使用缓冲流。C++语言程序设计10预定义的标准流与提取和插入运算符预先定义的四个流对象:–cin标准输入流键盘(缓冲流)–cout标准输出流显示器(缓冲流)–cerr标准错误输出流显示器(没有缓冲,发送给它的内容立即被输出。)–clog标准错误输出流打印机(但是有缓冲,缓冲区满时被输出。)C++语言程序设计11流是一个抽象的概念,当进行实际的输入/输出操作时,必须将流和具体的物理设备联系起来。标准流通过重载“”和“”来执行输入/输出操作,系统自动完成数据类型的转换。例:ostream流类对应每个基本数据类型对“”运算符都有重载:ostream&operator(ostream&dest,char*pSouce);ostream&operator(ostream&dest,intSouce);ostream&operator(ostream&dest,charSouce);例:inta=3;cout“MynameisJone”a;C++语言程序设计12可以通过重定向技术,将标准输入/输出设备指定为其它设备。Exampleresult.txtExampledata.txtC++语言程序设计13重载输出运算符“”ostream&operator(ostream&stream,class_nameobj){returnostream;}C++语言程序设计14#includeiostream.hclasscoord{public:intx,y;coord(){x=0;y=0;}coord(intI,intj){x=I;y=j;}};ostream&operator(ostream&stream,coordob){streamob.x“,”ob.yendl;returnstream;}voidmain(){coorda(5,6),b(10,34);coutab;}C++语言程序设计15一般情况下,重载输入(输出)运算符函数不能是类的成员函数。因为如果一个运算符函数是类的成员,则其左运算数就应当是调用运算符函数的类的对象,而此点是无法改变。重载输入(输出)运算符时,其左边的参数是流,而右边参数是类的对象。因此重载输入(输出)运算符函数必须是非成员函数(友元函数)。C++语言程序设计16#includeiostream.hclassthree_d{intx,y,z;public:three_d(inta,intb,intc){x=a;y=b;z=c;}friendistream&operator(istream&input,three_d&ob);friendostream&operator(ostream&output,three_dob);};ostream&operator(ostream&output,three_dob){outputob.x“,”ob.y“,”ob.zendl;returnoutput;}istream&operator(istream&input,three_dob){cout“Enterx,y,zvalue:”;inputob.xob.yob.z;retruninput;}voidmain(){three_dobj(10,20,30);coutobj;cinobj;coutobj;}C++语言程序设计17流的格式控制格式化I/O是按指定的格式对流进行I/O操作。比如,按十六进制输入一个整数、规定输出数据的宽度等。一般情况下,格式化I/O总是针对文本流的。C++标准的输入/输出流提供了许多格式控制常用的方法。C++语言程序设计18用流对象的成员函数控制输出宽度–为了调整输出,可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。C++语言程序设计19控制输出格式例使用width控制输出宽度#includeiostreamusingnamesoacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i4;i++){cout.width(10);coutvalues[i]'\n';}}输出结果:1.2335.36653.74358.24C++语言程序设计20例:使用*填充#includeiostreamusingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};for(inti=0;i4;i++){cout.width(10);cout.fill('*');coutvalues[i]'\n';}}输出结果:******1.23*****35.36*****653.7***4358.24C++语言程序设计21用控制符优点是可以直接将它们插入流中,不必单独调用:如下例:使用setw指定宽度C++语言程序设计22例使用setw指定宽度#includeiostream#includeiomanipusingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={Zoot,Jimmy,Al,Stan};for(inti=0;i4;i++)coutsetw(6)names[i]setw(10)values[i]endl;}输出结果:Zoot1.23Jimmy35.36Al653.7Stan4358.24C++语言程序设计23例设置对齐方式#includeiostream#includeiomanipusingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={Zoot,Jimmy,Al,Stan};for(inti=0;i4;i++)coutsetiosflags(ios::left)setw(6)names[i]resetiosflags(ios::left)setw(10)values[i]endl;}输出结果:Zoot1.23Jimmy35.36Al653.7Stan4358.24C++语言程序设计24例控制输出精度#includeiostream#includeiomanipusingnamespacestd;voidmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={Zoot,Jimmy,Al,Stan};coutsetiosflags(ios::scientific);for(inti=0;i4;i++)coutsetiosflags(ios::left)setw(6)names[i]resetiosflags(ios::left)setw(10)setprecision(1)values[i]endl;}输出结果:Zoot1.2e+000Jimmy3.5e+001Al6.5e+002Stan4.4e+003C++语言程序设计25进制dec、oct和hex操纵符设置输入和输出的缺省进制。C++语言程序设计26使用I/O成员函数(1)用getline()读取输入行当程序使用cin输入时,cin用空白符和行结束符将各个值分开。如根据所需输入的值,可能需要读取一整行文本,则用getline()。getline的功能是从输入流中读入多个字符,并且允许指定输入终止字符,读取完成后,从读取的内容中删除终止字符。C++语言程序设计27例:#includeiostream.hvoidmain(){charline[100];couttypealineterminatedby't'endl;cin.getline(line,100,'t');coutlineendl;}C++语言程序设计28(2)用get()读取(单个字符或多个字符)get函数的功能是提取运算符()很相像主要的不同点是get函数在读入数据时包括空白字符。(注:要单独提取换行符)getline()从输入流中输入一系统列字符时包括分隔符,而get()不包括分隔符。C++语言程序设计29#includeiostream.hvoidmain(){charc1,c2,c3,str1[80],str2[80];cout“type3char:”endl;c1=cin.get();cin.get(c2);cin.get(c3);cin.get();cout“inputfirstline:\n”;cin.get(str1,80);cin.get();cout“inputsecond:\n”;cin.getline(str2,80);cout“c1=”c1endl;cout“c2=”c2endl;cout“c3=”c3endl;cout“str1=”str1“\nstr2=”str2;}输入:abcComputerC++C++语言程序设计30(3)用p
本文标题:c++11
链接地址:https://www.777doc.com/doc-5857603 .html