




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章C+的I/O流库,本章内容,流概述、屏幕输出、键盘输入格式化输入和输出字符串流磁盘文件的输入和输出*,流的概念,所谓流是指数据从一个位置流向另一个位置。是用于输入输出的一组类。流的类型:文本流和二进制流。输出流与输入流。说明:“流”看成一个逻辑设备。“流”是临时的。提取操作和插入操作。,文件和缓存的概念,文件是对具体设备的抽象。如,磁盘文件和显示器都是文件。所有流的行为对程序员来讲都是相同的。说明:流统一了对相关文件的操作。缓冲缓冲区是指系统在内存中开辟的一块区域,临时存放信息.缓冲流:缓冲区满或当前输入流中有新的行符时,系统才对流进行刷新。非缓冲流:所有输入流中的数据将被外部设备立即处理。,流与文件、缓冲的关系示意图,内存,(程序),显示器键盘磁盘等设备,(文件),(流),插入,提取,缓冲流,C+流类的基本结构,iostream.h,流类的继承体系,ios,虚基类,提供一些关于对流状态进行设置的功能,有一个指向streambuf类的指针,管理一个流的缓冲区。为它的派生类提供缓冲支持。,提供从流中提取数据的操作的成员函数,提供从流中插入数据的操作成员函数,综合ostream和istream类的行为,支持对一个流同时进行输入输出操作,文件的打开和关闭是通过fstream类的成员函数open和close来实现的,C+中有4个预定义的流对象,一、标准输出,标准输出主要有三种形式:预定义的插入符利用cout的put()成员函数利用cout的write()成员函数,1.预定义的插入符,“);例如:coutabcd;,2.put()成员函数,功能:输出一个字符,将字符送进输出流。格式:cout.put(charc);或cout.put(constcharc);,例11.3:分析程序结果。,#includevoidmain()/输出常量couta,bn;cout.put(a).put(,).put(b).put(n);/输出变量charc1=A,c2=B;cout.put(c1).put(c2).put(n);,程序运行结果为:a,ba,bAB,3.write()成员函数,功能:输出一个字符串。格式:cout.write(constchar*str,intn)说明:str是一个字符指针或字符数组,用来存放一个字符串的,n是一个int型数,表示输出显示字符串中字符的个数。,例11.4:分析程序结果。,#include#includevoidPrintString(char*s)cout.write(s,strlen(s).put(n);cout.write(s,7)n;voidmain()charstr=IloveChina;coutthestringis:str)最一般的键盘输入是将提取符作用在流类的对象cin上。cin重载格式:istream使用格式:cin说明:从键盘上输入的两个数之间常用空白符、tab、或换行符作为分隔符。,例11.5:提取符的应用。,#include#includevoidmain()constintSIZE=80;charbufSIZE;char*largest;intcurLen,maxLen=-1,cnt=0;coutbuf)/输入单词以空白分隔,以ctrl+z结束。curLen=strlen(buf);cnt+;if(curLenmaxLen)maxLen=curLen;largest=buf;coutendl;cout单词个数:cntendl;cout最长的单词长度:maxLenendl;cout最后一个单词:largestbuf的值为0,则退出循环。,2.get()成员函数,使用get()读一个字符。格式:cin.get()格式:cin.get(charinti=0;coutinput:;while(ch=cin.get()!=EOF)cout.put(ch);i+;coutok!endl;couti=i;,程序运行结果为:input:abcdefghijklmnabcdefghijklmnZok!i=15,get()使用注意事项:,get()从输入流返回一个字符的ASCII码值,可以赋给一个int型量。EOF是一个符号常量,它的值是-1,被包含在iostream.h文件中。而put(ch)只能对char型量操作,不能操作int型量。,getline()成员函数格式:cin.getline(char*buf,intlimit,Deline=n);buf是一个字符指针或字符数组,limit用来限制从输入流中读取的字符个数,最多limit-1个,因为留一个字符来存放结束符。Deline是读取时指定的结束符,默认是n。,例11.7:编程统计从键盘上输入每一行字符的个数,从中选取出最短的行的字符个数,统计共输入多少行。,#includeconstintSIZE=80;voidmain()intlcnt=0,lmin=32767;charbufSIZE;coutinput.n;while(cin.getline(buf,SIZE)intcount=cin.gcount();lcnt+;if(countlmin)lmin=count;coutLine#lcntt;coutcharsread:countendl;cout.write(buf,count).put(n).put(n);coutendl;coutTotalline:lcntendl;coutshortestline:lminendl;,3.read()成员函数,成员函数read()可以从输入流中读取指定数目的字符并将它们存入在指定的数组中。格式:cin.read(char*buf,intsize)说明:buf:存放读取的字符的指针或字符数组。size:指定从输入流中读取字符的个数。使用gcount()统计上一次使用read()函数读取的字符个数。使用peek()函数,从输入流中返回下一个字符,但不提取。,例11.8:分析程序输出结果。,#includevoidmain()constintS=80;charbufS=;coutinput.n;cin.read(buf,S);coutcharsread:cin.gcount()endl;coutbufendl;,程序运行结果为:input.thisisac+program.Zcharsread:23thisisac+program.,例11.9:分析程序输出结果。,#includevoidmain()intch,cnt=0;coutinput.n;while(ch=cin.get()!=EOF)if(ch=i,程序运行结果为:input.thisisac+program.Z2,四、格式控制I/O操作,格式化输入与输出是指按规定的格式对流进行输入与输出操作。在没有进行格式控制的情况下,输入输出采用默认格式。控制数据的格式:使用成员函数设置标志位使用成员函数直接设置格式使用操作子,1.流的格式化标志,控制格式的标志位ios类中的保护成员,长整数x_flags,表示流的当前数据格式控制状态,称为格式化标志字(formattingflag)保护成员x_flags必须通过成员函数来访问。使用成员函数设置标志字longflags(long)longsetf(longsetbits,longfield)unsetf(long)在ios类中,还定义了下面的静态类对象:staticconstlongbasefield;其值为dec|oct|hex,表11.1ios标志位,例11.10:标志位设置的例子。,#includevoidmain()/清除dec,hex,设置8进制cout.setf(ios:oct,ios:basefield);cout25456HEX:56-38HEX:32-0 x20HEX:254-0XFE,设置标志字举例说明,setf格式:longios:setf(long_bits);例:cout.setf(ios:hex|ios:left);按十六进制输出,左对齐unsetf格式:longios:unsetf(long_bits);清除long_bits相应的标志格式字直接读写函数flags()longios:flags()longios:flags(long_xflags)注意:cout.setf(ios:hex);/16进制输出cout.flags(ios:hex);/16进制输出,并将其他标志清零,2.直接使用格式化输出函数,输出宽度控制函数width()intios:width();返回当前数据输出宽度,数据输出宽度在缺省情况下为表示数据所需的最少字符数。intios:width(intw);设置数据输出宽度,仅对下一个输出项有效,如果所设置的数据宽度小于数据所需的最少字符数时,则数据宽度按缺省宽度处理。,输出精度控制函数precision()intios:precision();返回当前数据输出精度,默认值为6位intios:priecision(intp);设置数据输出精度float型实数最多提供7位有效数字,double型实数最多提供15位有效数字,longdouble型实数最多提供19位有效数字。,填充当前宽度内的填充字符函数fill()charfill();返回当前所使用的填充字符,缺省的填充字符为空格符。charfill(char)设置填充字符为参数值所表示的字符,并返回更新的填充字符。,3.操作子,操作子是一个对象,它们可以直接被插入符或提取符操作。操作子举例:couthex100;coutsetw(6)test;couti;clogiflush;,表11.2操作子,例11.11:分析程序输出结果。,#include#includevoidmain()cout12345678901234567890endl;inti=1234;coutiendl;coutsetw(12)iendl;coutresetiosflags(ios:right);coutsetiosflags(ios:left)setfill(*);coutsetw(12)iendl;coutwidth:cout.width()endl;,程序运行结果为:12345678901234567890123412341234*width:0,例11.12:分析程序输出结果。,#include#include#includeusingnamespacestd;intmain()inti;cout|;for(i=0;i10;i+)coutsetw(5)i;coutendl-+;for(i=0;i10;i+)cout-;coutfixedsetprecision(3);for(i=0;i10;i+)coutendlsetw(2)i|;for(intj=0;j10;j+)coutsetw(7)sqrt(i*10+j);cout”和输出运算符“”或“(istream,例11.13:分析程序输出结果。,#includeclassDatepublic:Date(inty,intm,intd)Year=y;Month=m;Day=d;friendostream,ostream,voidmain()DateCDate(2008,8,8);coutCDate;coutNewdate:CDateendl;,Currentdate:2008/8/8Enternewdate:20081130Newdate:2008/11/30,五、字符串流,C+的I/O流库中提供了两个类:ostrstreamistrstream说明:包含在strstream.h文件中。可以实现将一个字符串内的数字字符转换成二进制形式存放在某种类型的对象中,或者将一个二进制数转换成字符存储在一个字符数组对象中。,1.ostrsteam类的构造函数,ostrstream类的构造函数有两种原型。ostrstream:ostrstream();这是缺省构造函数,用来建立存储所插入的数据的数组对象。ostrstream:ostrstream(char*s,intn,intmode=ios:out);s指所插入的字符指针或字符数组;n是指定这个数组最多能存放的字符个数;mode给出了流的方式,缺省为out,还可以选用ate和app方式。注意:ostrstream在进行插入操作时,并不在输出流中的末尾自动添加空字符,需要在程序中显式地添加这个空字符。,例11.14:分析程序输出结果。,#include#include#includeconstintN=80;voidmain()charbufN;/创建一个流对象,将流向一个字符数组bufostrstreamout1(buf,sizeof(buf);inta=80;for(inti=0;i5;i+,a+=10)out1a=a;/将a=和int型数和;,通过out1插入到buf中out10;coutbuf:bufab;couta+bendl;,程序运行结果为:168.67,六、磁盘文件的输入和输出,对文件的操作是由文件流类完成的。文件流类在流与文件之间建立连接。文件流分为:输入流、输出流、输入/输出流磁盘文件一般分为:文本文件、二进制文件对磁盘文件流的基本操作:定义流对象、打开、读写操作、关闭,(1)定义文件流类对象格式:文件流类对象名;例如:ifstreamifile;/定义一个文件输入流对象ofstreamofile;/定义一个文件输出流对象fstreamiofile;/定义一个文件输入输出流对象,1.磁盘文件的打开和关闭,(2)文件的打开利用文件流对象的成员函数open()voidopen(char*filename,intmode,intaccess=filebuf:openprot);说明:filename:指定要打开的文件名mode:指定了文件的打开方式access:指定文件系统属性例如:ifile.open(f1.txt,ios:in);ofile.open(f2.txt,ios:out);iofile.open(f2.txt,ios:in|ios:out);也可以:fstreamiofile(f2.txt,ios:in|ios:out);,0一般文件1只读文件2隐藏文件3系统文件,表11.3文件访问方式常量,例如:ofile.open(“f2.txt”,ios:out|ios:app|ios:binary);,(3)文件的关闭利用文件流对象的成员函数close()voidfstreambase:close();例如:ifile.close();ofile.close();iofile.close();说明:关闭文件时,系统将刷新与该流相关的缓冲区。文件的打开和关闭操作,可以使一个文件流与多个文件建立联系,但在任意时刻只能与一个文件发生联系。,2.文件流状态的判别,用文件流对象的成员函数来判别文件流的当前状态:is_open():判定流对象是否与一个打开的文件相联系,若是,返回true,否则返回false;good():刚进行的操作成功时返回true,否则返回false;bad():如果进行了非法操作返回true,否则返回false;fail():刚进行的操作不成功时返回true,否则返回false;eof():进行输入操作时,若到达文件尾返回true,否则返回false。例如:if(!iofile.eof()if(ofile.good()等同于if(ofile)if(oflie.fail()等同于if(!ofile),3.文本文件的读写操作,对文本文件进行读写操作时,首先要打开文件,然后再对打开文件时设定的文件流进行操作,最后关闭文件。,例11.17:文本文件的写操作。,#include#include#includevoidmain()fstreamoutfile;/定义文件输出流/以写方式打开文件outfile.open(f2.txt,ios:out);if(!outfile)cout文件打开失败n;abort();/退出程序/利用输出流向文件写入文本outfile.write(把文本写入指定的文件。,22).put(n);/利用输出流向文件写入文本outfile把文本写入到指定的文件中去。n;outfile.close();/关闭文件,例11.18:文本文件的读操作。,#include#include#includevoidmain()chars80;fstreaminfile;/定义文件输入流infile.open(f2.txt,ios:in);/以读方式打开文件if(!infile)cout文件打开失败.n;abort();/退出程序while(!infile.eof()/判断文件是否结束infile.getline(s,sizeof(s);/从文本中读取一行coutsendl;infile.close();/关闭文件,把文本写入指定的文件。把文本写入到指定的文件中去。,例11.19:单个字符的读写例子。,#include#include#include#includevoidmain()fstreamoutfile,infile;/定义输入/出流outfile.open(f3.txt,ios:out);if(!outfile)cout文件打开失败.n;abort();charstr=get/put的应用.;for(inti=0;i=strlen(str);i+)outfile.put(stri);/写入一个字符outfile.close();,infile.open(f3.txt,ios:in);if(!infile)cout文件打开失败.n;exit(1);/abort();charch;while(infile.get(ch)/从文件中读取一个字符coutch;coutendl;infile.close();,程序运行结果为:get/put的应用.,4.二进制文件的读写操作,打开二进制文件时,在open()函数中需要使用ios:binary方式。向二进制文件中写入信息时,需要使用write()函数。从二进制文件中读信息,可以使用read()函数。,例11.20:分析程序输出结果。,#include#include#include#includeclasspersonprivate:charname20;doubleheight;intage;public:person();person(char*nm,doubleh,inta)strcpy(name,nm);height=h;age=a;person();voidprintperson()coutnametheighttageendl;,voidmain()person*p;p=newperson2;p0=person(wang,165.5,23);p1=person(li,182.8,34);fstreaminfile,outfile;outfile.open(person.dat,ios:out|ios:binary);if(!outfile)cout文件不能打开!n;abort();for(inti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车机械制图试卷及答案
- 吊车指挥教学题库及答案
- 摩托车轮毂新建项目技术方案
- 绿化工程施工组织设计小包
- 环保设备安装与调试实施方案
- 离婚协议男方净身出户房产过户操作流程模板
- 离婚协议违约金条款的解除与变更规定
- 生源地信用助学贷款合同示范文本(专科)
- 离婚双方子女抚养权变更及经济补偿补充协议
- 离婚无子女子女监护协议范本与财产分割专项服务
- 人工动静脉瘘狭窄查房
- 15D501 建筑物防雷设施安装
- 加药装置技术规范书2014.1.16
- 水利工程中挡土墙的选型与稳定性验算
- 四年级语文下册看拼音写词语-田字格
- 重庆出版社综合实践四年级上全册教案
- 《先进制造技术》课件(全套)
- 花瓣凸台四方型腔铣削加工-数控机床毕业论文
- 一级建造师考试《水利水电工程管理与实务》电子书
- 记承天寺夜游(王崧舟)
- CAD快捷命令to犀牛
评论
0/150
提交评论