(精品)C++程序设计__第11章_C++的IO流类库.ppt
《(精品)C++程序设计__第11章_C++的IO流类库.ppt》由会员分享,可在线阅读,更多相关《(精品)C++程序设计__第11章_C++的IO流类库.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第11章 C+的IO流库本章内容提要流概述、屏幕输出、键盘输入格式化输入和输出磁盘文件的输入和输出字符串流、流错误的处理2008-2009-22C+程序设计流的概念用于输入输出地一组类。流有两种类型:文本流、二进制流。输出流与输入流。说明:l“流”看成一个逻辑设备。l“流”是临时的。l提取操作和插入操作。2008-2009-23C+程序设计文件和缓存的概念文件l是对具体设备的抽象。如,磁盘文件和显示器都是文件。l所有流的行为对程序员来讲都是相同的。l说明:流统一了对相关文件的操作。缓冲l缓冲区是指系统在内存中开辟的一块区域临时存放信息.l缓冲流:缓冲区满或当前输入流中有新的行符时,系统才对流进
2、行刷新。l非缓冲流:所有输入流中的数据将被外部设备立即处理。2008-2009-24C+程序设计流与文件、缓冲的关系示意图内存内存(程序)(程序)显示器显示器键盘键盘磁盘磁盘等等设备等等设备(文件)(文件)(流)(流)插入插入提取提取缓冲流缓冲流2008-2009-25C+程序设计C+流类的基本结构iostream.h流类的继承体系流类的继承体系iosostreamistreamfstreamiostreamofstreamifstreamclogcerrcoutcinstreambuf虚基类,提供一些关虚基类,提供一些关于对流状态进行设置于对流状态进行设置的功能,有一个指向的功能,有一个指向
3、streambufstreambuf类的指针类的指针管理一个流的缓冲管理一个流的缓冲区。为它的派生类区。为它的派生类提供缓冲支持。提供缓冲支持。提供从流中提取数据提供从流中提取数据的操作的成员函数的操作的成员函数提供从流中插入数提供从流中插入数据的操作成员函数据的操作成员函数综合综合ostreamostream和和istreamistream类的行为,类的行为,支持对一个流同时支持对一个流同时进行输入输出操作进行输入输出操作文件的打开和关闭是通过文件的打开和关闭是通过fstreamfstream类的成员函数类的成员函数openopen和和closeclose来实现的来实现的2008-2009-
4、26C+程序设计一、标准输出 C+中有4个预定义的流对象 流对象含义物理设备cin标准输入键盘cout标准输出屏幕cerr(处理标准出错信息)无缓冲的标准输出屏幕clog(处理标准出错信息)有缓冲的标准输出打印机2008-2009-27C+程序设计一、标准输出标准输出主要有三种形式:l预定义的插入符l利用cout的put()成员函数l利用cout的write()成员函数2008-2009-28C+程序设计1.预定义的插入符“”插入运算符,向输出流中插入一个字符序列。重载在ostream类中定义,cout是数据的目的地。功能:数据输出到计算机屏幕 重载格式:ostream&operator (o
5、stream&,);例如:lcoutabcd;2008-2009-29C+程序设计例11.1:问题:分析程序结果。#includevoid main()int a=100;int*pa=&a;cout&pa=&paendl;cout&pa=long(&pa)endl;程序运行结果为:程序运行结果为:&pa=0 x0013FF78&pa=13105842008-2009-210C+程序设计例11.2:问题:分析程序结果。#include void main()int i=2,j=9;coutcompare:i,jendl;coutThe largest value isj)?i:jendl;程序
6、运行结果为:程序运行结果为:error C2297:illegal,right operand has type class ostream&(_cdecl*)(class ostream&)#include void main()int i=2,j=9;coutcompare:i,jendl;cout“The largest value is”j)?i:j)endl;2008-2009-211C+程序设计2.put()成员函数 屏幕输出的第二种方法可以由成员函数put()实现。使用成员函数put()写一个字符。成员函数put()是将字符送进输出流格式:lcout.put(char c);l或
7、lcout.put(const char c);2008-2009-212C+程序设计例11.3:问题:分析程序结果。#include void main()couta,bn;/输出常量输出常量cout.put(a).put(,).put(b).put(n);char c1=A,c2=B;cout.put(c1).put(c2).put(n);/输出变量输出变量程序运行结果为:程序运行结果为:a,ba,bAB2008-2009-213C+程序设计3.write()成员函数 成员函数write()也可实现屏幕的输出。使用成员函数write()输出一个字符串。格式:lcout.write(cons
8、t char*str,int n)说明:lstr是一个字符指针或字符数组,用来存放一个字符串的,n是一个int型数,表示输出显示字符串中字符的个数。2008-2009-214C+程序设计例11.4:问题:分析程序结果。#include#includevoid PrintString(char*s)cout.write(s,strlen(s).put(n);cout.write(s,7)n;void main()char str=I love China;coutthe string is:str)l最一般的键盘输入是将提取符作用在流类的对象cin上。cin重载格式:listream&opera
9、tor(istream&is,classtype&var);使用格式:lcin说明:l从键盘上输入的两个数之间常用空白符、tab、或换行符作为分隔符。2008-2009-217C+程序设计例11.5:问题:提取符的应用。#include#includevoid main()const int SIZE=80;char bufSIZE;char*largest;int curLen,maxLen=-1,cnt=0;coutbuf)/输入单词以空白分隔,以输入单词以空白分隔,以ctrl+z结束。结束。curLen=strlen(buf);cnt+;if(curLenmaxLen)maxLen=cu
10、rLen;largest=buf;coutendl;cout单词个数:单词个数:cntendl;cout最长的单词长度:最长的单词长度:maxLenendl;cout最后一个单词:最后一个单词:largestbuf的值为0,则退出循环。2008-2009-219C+程序设计2.get()成员函数使用get()读一个字符l格式:cin.get()如例9-9l格式:cin.get(char&ch)l格式:cin.getline(char*buf,int limit,Deline=n);如例9-10注意:该函数从输入流中获取字符时,不忽略空白符。2008-2009-220C+程序设计例11.6:问题
11、:分析程序输出结果。#include void main()char ch;int i=0;coutinput:;while(ch=cin.get()!=EOF)cout.put(ch);i+;coutok!endl;couti=i;程序运行结果为:程序运行结果为:input:abcdefghijklmnabcdefghijklmnZok!i=152008-2009-221C+程序设计get()使用注意事项:get()从输入流返回一个字符的ASCII码值,可以赋给一个int型量。EOF是一个符号常量,它的值是-1,被包含在iostream.h文件中。put(ch)只能对char型量操作。与ge
12、t()不同。2008-2009-222C+程序设计例11.7:问题:编程统计从键盘上输入每一行字符的个数,从中选取出最短的行的字符个数,统计共输入多少行。#include const int SIZE=80;void main()int lcnt=0,lmin=32767;char bufSIZE;coutinput.n;while(cin.getline(buf,SIZE)int count=cin.gcount();lcnt+;if(countlmin)lmin=count;coutLine#lcntt“;coutchars read:countendl;cout.write(buf,co
13、unt).put(n).put(n);coutendl;coutTotal line:lcntendl;coutshortest line:lminendl;程序运行结果为:程序运行结果为:input.oneLine#1 chars read:4one2008-2009-223C+程序设计3.read()成员函数成员函数read()可以从输入流中读取指定数目的字符并将它们存入在指定的数组中。格式:lcin.read(char*buf,int size)说明:lbuf:存放读取的字符的指针或字符数组。lsize:指定从输入流中读取字符的个数。l也可以使用gcount()统计上一次使用read()
14、函数读取的字符个数。l使用peek()函数,返回字符但不提取。2008-2009-224C+程序设计例11.8:问题:编程统计从键盘上输入每一行字符的个数,从中选取出最短的行的字符个数,统计共输入多少行。#include void main()const int S=80;char bufS=;coutinput.n;cin.read(buf,S);coutchars read:cin.gcount()endl;coutbufendl;程序运行结果为:程序运行结果为:input.this is a c+program.Zchars read:23this is a c+program.2008
15、-2009-225C+程序设计例11.9:问题:分析程序输出结果。#include void main()int ch,cnt=0;coutinput.n;while(ch=cin.get()!=EOF)if(ch=i&cin.peek()=s)cnt+;coutcntendl;程序运行结果为:程序运行结果为:input.this is a c+program.Z22008-2009-226C+程序设计四、格式控制I/O操作 格式化输入与输出是指按规定的格式对流进行输入与输出操作。在没有特意进行格式控制的情况下,输入输出采用默认格式。两种方式控制数据的格式:l使用成员函数设置标志位l使用成员函
16、数直接设置格式l使用操作子2008-2009-227C+程序设计默认的输入输出格式 默认的输入格式 lshort、int、long(signed、unsigned):与整型常量相同lfloat、double、long double:与浮点数常量相同lchar(signed、unsigned):第一个非空白字符lchar*(signed、unsigned):从第一个非空白字符开始到下一个空白字符结束lvoid*:无前缀的16进制数lbool:把true或1识别为true,其他的均识别为false例如,执行例如,执行int a,b;char c;char d20;cinabcd;若输入:若输入:1
17、23 456abcde efg则则a的值为的值为123,b的值为的值为456,c的值为的值为a,d的值为的值为bcde。2008-2009-228C+程序设计默认的输入输出格式 默认的输出格式 lshort、int、long(signed、unsigned):一般整数形式,负数前有-号lfloat、double、long double:浮点格式或指数格式(科学表示法),取决于哪个更短lchar(signed、unsigned):单个字符(无引号)lchar*(signed、unsigned):字符序列(无引号)lvoid*:无前缀的16进制数lbool:1或0例如,执行例如,执行char c=
18、A,*p=Hello!;cout123c-123endl;coutp(void*)p;将输出:将输出:123A-123Hello!0041B18C2008-2009-229C+程序设计1.流的格式化标志控制格式的标志位(如表11.1)lios类中的保护成员,长整数x_flags,表示流的当前数据格式控制状态,称为格式化标志字(formatting flag)l保护成员x_flags必须通过成员函数来访问。使用成员函数设置标志字llong flags(long)llong setf(long setbits,long field)lunsetf(long)l在ios类中,还定义了下面的静态类对象
19、:static const long basefield;其值为del|oct|hex2008-2009-230C+程序设计表11.1 ios标志位 标志位值含义输入/输出shipws0 x0001跳过输入中的空白符ileft0 x0002输出数据按输出域左对齐oright0 x0004输出数据按输出域右对齐ointernal0 x0008数据的符号左对齐,数据本身右对齐,符号和数据之间为填充符odec0 x0010转换基数为十进制形式i/ooct0 x0020转换基数为八进制形式i/ohex0 x0040转换基数为十六进制形式i/oshowbase0 x0080输出的数值数据前面带有基数符号
20、(0或0 x)oshowpoint0 x0100浮点数输出带有小数点ouppercase0 x0200用大写字符输出十六进制数值oshowwpos0 x0400正数前面带有“+”符号oscientific0 x0800浮点数输出采用科学表示法ofixed0 x1000使用定点数形式表示浮点数ounitbuf0 x2000完成输入操作后立即刷新流的缓冲区ostdio0 x4000完成输入操作后刷新系统的stdout,stderro2008-2009-231C+程序设计例11.10:问题:标志位设置的例子。#include void main()/清除清除dec,hex,设置,设置8进制进制 co
21、ut.setf(ios:oct,ios:basefield);cout56endl;/设置设置10进制,进制,ios:basefield可加可不加可加可不加 cout.setf(ios:dec);cout56endl;cout.flags(ios:hex);/清除清除dec,oct,设置,设置16进制进制 cout56endl;/输出的数值前带有基数符号输出的数值前带有基数符号 cout.setf(ios:showbase);cout32endl;/用大写字母输出十六进制数值用大写字母输出十六进制数值 cout.setf(ios:uppercase);cout25470DEC:56-70HEX
22、:56-38HEX:32-0 x20HEX:254-0XFE2008-2009-232C+程序设计设置标志字举例说明setf格式:llong ios:setf(long_bits);l例:cout.setf(ios:hex|ios:left);l按十六进制输出,左对齐unsetf格式:llong ios:unsetf(long_bits);l清除long_bits相应的标志格式字直接读写函数flags()llong ios:flags()llong ios:flags(long_xflags)l注意:cout.setf(ios:hex);/16进制输出lcout.flags(ios:hex);
23、/16进制输出,并将其他标志清零2008-2009-233C+程序设计2.直接使用格式化输出函数输出宽度控制函数width()lint ios:width();lint ios:width(int w);l注意:仅对下一个输出项有效输出精度控制函数precision()lint ios:precision();lint ios:priecision(int p);l注意:默认值为6位2008-2009-234C+程序设计注意几点:数据输出宽度在缺省情况下为表示数据所需的最少字符数。缺省的填充字符为空格符。如果所设置的数据宽度小于数据所需的最少字符数时,则数据宽度按缺省宽度处理。float型实数
24、最多提供7位有效数字,double型实数最多提供15位有效数字,long double型实数最多提供19位有效数字。2008-2009-235C+程序设计3.操作子操作子是一个对象,它们可以直接被插入符或提取符操作。表9-2列出了流类库定义的操作子操作子举例:lcouthex100;lcoutsetw(6)test;lcouti;lclogiflush;例9-17 使用操作子2008-2009-236C+程序设计表11.2 操作子 操作子名含义输入/输出dec数值数据采用十进制表示i/ohex数值数据采用十六进制表示i/ooct数值数据采用八进制表示i/osetbase(int n)设置数制转
25、换基数为n(n为0,8,10,16)0表示使用缺省基数i/ows提取空白符iends插入空字符oflush刷新与流相关联的缓冲区oresetiosflags(long)清除参数所指定的标志位i/osetiosflags(long)设置参数所指定的标志位i/osetfill(int)设置填充字符osetsprecision(int)设置浮点数输出的有效数字个数osetw(int)设置输出数据项的域宽o2008-2009-237C+程序设计例11.11:问题:分析程序输出结果。#include#include void main()cout12345678901234567890endl;int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 C+ 程序设计 _ 11 _C IO 流类库
限制150内