91 C++中流的概念与层次结构文档格式.docx
- 文档编号:21085912
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:32.05KB
91 C++中流的概念与层次结构文档格式.docx
《91 C++中流的概念与层次结构文档格式.docx》由会员分享,可在线阅读,更多相关《91 C++中流的概念与层次结构文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
引入:
什么是流?
主题:
从程序的角度出发,根据操作对象的不同,可以将输入/输出分为以下三类:
●从系统指定的标准设备进行输入/输出。
即从键盘输入数据,输出到显示器或打印机,这种方式称为标准I/O
●以磁盘文件作为对象进行输入/输出,从文件中读入数据,将结果输出到文件,简称文件I/O
●对内存中指定的空间进行输入/输出,指从某一内存空间中接收数据,再将处理后的结果,输出到某一内存空间。
无论是哪一种形式的输入/输出,在数据传输过程中,由若干字节组成的字节序列总是如流水一般从一个对象传送到另一个对象,因此将数据的传输过程形象地称为流(Stream)。
把从键盘,文件及其他内存对象中获取数据称为数据流入,对应的数据流称为输入流(InputStream),反之则称为数据流出和输出流(OutputStream)。
在C++中流被定义为类,称为流类,用流类定义的对象称为流对象。
在数据传输时,首先使用“流类”定义一个“流对象”,然后再通过流对象去操纵数据进行输入/输出。
通过使用流的方式来统一对各种计算机设备和文件进行操作,使程序与具体的设备,文件无关,从而提高了程序设计的通用性和灵活性。
流类的层次结构[15分钟]
C++中提供了丰富的流类用于输入输出。
具体类库流类层次结构见课本图9.1.2和表9.1.1。
与iostream类库有关的头文件
iostream类库中不同的类的声明被放在不同的头文件中,用户只需在自己的程序中用#include命令包含不同的头文件,即可使用在头文件声明的类和对象。
下表列出了iostream类库中有关的头文件
头文件名名
说明
iostream
包含对输入输出流进行操作所需的基本信息
fstream
包含对文件I/O操作的各种类和对象
strstream
用于字符串流I/O
stdiostream
用于混合使用C和C++的I/O操作
iomanip
用于格式化I/O操作
iostream类库中预定义的流对象
为方便用户的使用,在iostream中预定义了4个流对象,下表给出了4个流对象的简要描述。
对象
对应的类
含义
对应设备
cin
istream
标准输入流
键盘
cout
ostream
标准输出流
显示器
cerr
标准错误流(不带缓冲区)
clog
标准错误流(带缓冲区)
cin是istream的对象,用于表示从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。
cout是ostream的对象,它是从内存输出到标准输出设备(显示器)的数据流,称为cout流或标准输出流。
cerr和clog也是ostream的对象,与cout流的用途略有不同,这两个流主要用于输出错误信息,其中cerr流是不带缓冲区的输出流,即直接输送到器上,而clog流是带缓冲区的输出流,因此在显示速度上,clog要比cerr快。
标准输出流的基本操作[28分钟]
标准输出流是流向标准输出设备的数据,其典型代表是cout对象。
cout对象是ostream类的一个实例。
ostream类提供了格式化输出与无格式化输出的功能。
输出功能包括:
用流插入运算符“<
<
“输出C++基本数据类型的数据;
用成员函数与流格式控制符控制输出格式。
流插入运算符
“<
”运算符在C++中本来是被定义为左位移运算符,在ostream类中对该运算符进行了重载,使其可以作为标准数据的输出运算符,称为流插入运算符“<
”。
流插入运算符可以实现数据向流的输出,实际上是位于插入运算符右侧的数据被存储到“<
”左侧的流中。
为实现多种数据类型的输出,在ostream对该运算符经过了多次重载,可以实现各种基本数据类型的输出。
如果要实现用户自定义数据类型的输出,需要用户重载该运算符方可实现。
[举例]
使用成员函数输出
cout作为ostream类对象,可以使用成员函数实现输出功能,常用的函数有put与write.
(1)put函数
put函数是ostream类中专用于输出单个字符的成员函数,其声明形式如下:
ostream&
put(charch);
可以看到参数为单个字符,其功能就是将该字符放置到流对象中。
其引用方式如下:
流对象>
.put(<
输出字符>
)
这里要说明的是由于字符型数据在内存中是实际保存的是字符的ASCII码值。
特别要注意的该函数的返回值类型ostream类的引用,实际就是调用put函数对象的引用。
(2)write函数
write函数可以将一个字符串中前n个字符放置到流对象中,其声明如下:
put(constchar*pch,intnCount);
第一个参数pch表示用于输出的字符串,第二个参数nCount表示将输出的字符个数,同样这里的返回值类型也是ostream的引用。
格式化输出
在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如对浮点型数据要求只保留2位小数等。
有两种方式可以实现此目的,一种是使用控制符控制输出格式,另一种是使用流对象的成员函数实现。
由于使用流对象的成员函数更加符合面向对象的编程习惯,这里只介绍该种方式。
为了方便程序员进行格式化输出,在ios类中定义了一个long型的数据成员x_flags,称为格式状态标志。
其中的常量和作用如表所示
格式标志
作用
ios:
:
skipws
跳过输入中的空白符
left
输出数据靠左对齐
right
输出数据靠右对齐
internal
数值的符号位左对齐,数值右对齐,中间由填充字符填充
dec
以10进制方式进行I/O
oct
以8进制方式进行I/O
hex
以16进制方式进行I/O
showbase
强制输出基数(8进行以0开始,16进制以0x开始)
showpoint
强制输出浮点数的小数点和尾数0
upppercase
输出16进制时以大写A-F表示
showpos
正数前输出’+’号
scientific
浮点数以科学记数法格式输出
fixed
浮点数以定点格式(小数形式)输出
unitbuf
每次输出后,刷新所有流
stdio
输出后只刷新cout和cerr流
以上的格式标记需通过iostream的成员函数setf调用即可设定为有效才能起作用,下面以setf为代表介绍几个常用的格式控制成员函数。
(1)setf
setf函数用于设置x_flags的状态位,其功能是使某标志位有效,使用方法是将代表x_flags作用setf函数的实参。
setf函数所设置的格式输出方式将从设置后的下一条输出语句开始起作用,直到该标志被unsetf函数清除为止。
(2)unsetf
unsetf函数用于清除x_flags的状态位,其参数与setf函数一样,也是x_flags格式标志位,区别在于:
setf是设置该位,使其有效
unsetf是清除该位,使其无效
(3)precision函数
precision函数用于设置浮点数的精度,其参数为精度值。
(4)fill函数
fill函数用于设置显示空白位置的填充字符,其参数是要显示的字符。
(5)width函数
width函数用于控制输出数据的宽度。
注意:
width函数与其他成员函数的最大不同在于,该设置无持久性,只对设置后的第一条语句有效。
练习:
练习9.1.1从键盘接收5个数据,并输出。
要求保留2位小数,且输出时各行小数点要对齐。
(运行结果应如图9.1.7所示)
提示:
本题主要考核对格式化输出的使用,请对照表9.1.4思考本题应使用哪些标志位。
解决:
见solution-code/E9-1-1.cpp
输出十六进制数时,采用如下方法:
cout<
hex<
0XA434<
endl;
或者
cout.setf(ios:
hex,ios:
basefield);
而如下代码输出的将是十进制数:
hex);
标准输入流的基本操作30分钟]
标准输入流是从标准输入设备(键盘)流向内存或者其他目的地的数据,其典型代表是cin对象。
cin对象是istream类的一个实例。
istream类提供了从标准输入设备(键盘)接收数据的功能。
输入功能包括:
用流提取运算符“>
>
”从对象输入C++基本数据类型的数据;
用成员函数输入数据。
流提取运算符
“>
”运算符在C++中本来是被定义为右位移运算符,在istream类中对该运算符进行了重载,使其可以作为基本数据类型的输入运算符,称为流提取运算符。
流提取运算符可以实现从标准输入设备中提取数据,即实现键盘输入的功能。
与流插入运算符的理解类似,流提取运算符可以理解为将运算符左侧的流中(cin对象)的数据插入到运算符右侧的变量中,即实现从键盘接收数据存储到变量的功能。
为实现多种数据类型的输入,在istream类中对该运算符进行了多次重载,可以实现各种基本数据类型的输入。
cin流与cout流一样有一个缓冲区,在接收数据时通常会先将数据存放到缓冲区中,直到按下回车键后才会从缓冲区中提取数据,并且在提取数据时通常会跳过输入流中的空格、tab键、换行符等空白字符。
在提取时需要保证输入数据和变量的数据类型想匹配,才能正常提取,否则将导致输入流出错。
下面对各种基本数据类型分别进行分析。
(1)整数的输入
流提取运算符在输入整数时,会跳过整数前的空白字符,读入直到不是整数的值为止。
(2)浮点数的输入
浮点数的输入与整数的输入类似,也会跳过前面的空白字符,读入直到非浮点字符为止,不过这里浮点字符包括数字(0-9),小数点,正负号及科学记数中的指数E或e。
(3)字符数据的输入
字符数据在读入时,也能跳过前面的空白字符,读入字符直到遇到空白符为止。
这样将导致在数据时无法读入空格等正常的空白字符。
使用成员函数输入
除了可以用cin输入标准类型的数据外,还可以用istream类对象的一些成员函数,实现字符的输入。
(1)get函数
流成员函数get其参数形式有3种:
intget();
istream&
get(char&
rch);
get(char*pch,intnCount,chardelim=’\n’);
不带参数的get函数从指定的输入流中读取一个字符(包括空白符),并返回该字符的ASCII码;
当遇到输入流中的文件结束符时,get函数返回EOF。
带一个参数的get函数从流中读取一个字符,然后将该字符存入实参变量中;
当遇到输入流的文件结束符时,将EOF存入实参变量中。
带三个参数的get函数的三个参数含义分别是接收字符的字符指针、接收的字符长度和终止符(默认是’\n’)。
函数的功能是从输入流中读取nCount-1个字符,赋给指定的字符数组或字符指针所指向的数组,如果在读取nCount-1个字符之前遇到指定的终止符,则提前结束。
示例讲解:
示例9.1.1get函数的使用
分析与解答:
具体见P411
(2)getline函数
getline函数的作用是从输入流中读取一行字符,其用法与带个3个参数的get函数类似,其声明形式如下:
getline(char*pch,intnCount,chardelim=’\n’);
getline函数与get函数的区别如下:
用getline函数从输入流读字符时,遇到终止标志字符时结束,指针移到该终止标志字符之后,下一个getline函数将从该终止标志的下一个字符开始接着读入。
而get函数从输入流读字符时,遇到终止标志字符时停止读取,指针不向后移动,仍然停留在原位置。
下一次读取时仍从该标志位开始读取。
如当get函数遇到终止符‘\n’时,不会自动下移,而getline函数遇到终止符’\n’时则自动移动下一个字符。
因此在使用get函数时要注意使用其他方法跳过终止标志字符。
(3)ignore函数
ignore函数没有输入功能,其作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
其声明形式如下:
&
istreamignore(intnCount=1,chardelim=EOF);
第一个参数nCount表示要跳过的字符的个数,默认为1;
第二个参数delim表示终止字符,默认为EOF结束符,因此在具体使用时,可以带2个参数,也可以带1个参数,甚至于不带参数。
不带参数时
cin.ignore()相当于cin.ignore(1,EOF)
因此在使用get函数时,往往在其后要跟上一个ignore函数用于跳过结束标志字符。
练习9.1.2在早期的学校图书管理系统中,如在输入数据时不慎输入空格等字符时将会导致程序出现错误,例如,下表中,在输入姓名时,将“丁一”输为“丁 一”就为使程序出错。
为了提高程序的稳定性,现在请你改写下面的原始代码,改进程序的数据录入模块,使其可以接受空格等空白字符。
学号
借书证号
姓名
年龄
通讯地址
05010001
B0500001
丁 一
18
湖南省长沙市韶山北路177号
原始代码:
/********************************************
*Name:
9_1_E_2.cpp
*Author:
James.Tang
*Description:
书9_1_S_4
*提取运算符演示
*Date:
2005-01-08
*Copyright:
HNSUniversity
********************************************/
#include<
iostream>
//使用标准输入/输出库
usingnamespacestd;
//使用标准命名空间
classStudent{
private:
stringstudentId;
//学号
stringcardId;
//卡号
stringname;
//姓名
intage;
//年龄
stringaddress;
//地址
public:
voidgetDetail(){
"
学号:
;
cin>
studentId;
借书证号:
cardId;
姓名:
name;
年龄:
;
age;
通讯地址:
address;
}
};
intmain()
{
Studentstu;
stu.getDetail();
system("
pause"
);
return0;
}
见solution-code/E9-1-2.cpp
小结[2分钟]
通过本节的学习,您理解了流的概念,C++中的流类库中重要的类的层次结构,并以cout,cin对象为例重点学习了标准输出流和标准输入流的使用,为文件流的学习打下了基础,下面将本节的主要内容归纳如下:
1.流的概念
在数据传输过程中,由若干字节组成的字节序列总是如流水一般从一个对象传送到另一个对象,因此将数据的传输过程形象地称为流(Stream),C++中通过使用流的方式来统一对各种计算机设备和文件进行操作,使程序与具体的设备,文件无关,从而提高了程序设计的通用性和灵活性。
2.流类的层次结构
所有的流类都从抽象基类ios派生而来,其中直接派生出3个派生类istream,ostream,fstreambase。
而fstreambase又是所有文件流类的基类,由它再派生出ifstream,ofstream和fstream。
具体的层次结构可参看图9.1.2。
这些流类都分别存放在不同的头文件中,要使用不同的流类,需用#include命令包含相应的头文件。
其中在iostream头文件中,为方便使用预定义了4个流对象cout,cerr,clog和cin。
3.标准输出流的使用
●用流插入运算符“<
”输出C++基本数据类型的数据;
●用成员函数输出字符数据;
●用流格式控制符控制输出格式
4.标准输入流的使用
●用流提取运算符“>
”从对象输入C++基本数据类型的数据;
●用成员函数输入数据
考核点
考核点1:
流的概念
考核点2:
基本输入流
考核点3:
基本输出流
作业答案
1:
C++中的输入与输出可以分为哪几类?
答:
输入/输出分为以下三类:
①从系统指定的标准设备进行输入/输出。
②以磁盘文件作为对象进行输入/输出,从文件中读入数据,将结果输出到文件,简称文件I/O
③对内存中指定的空间进行输入/输出,指从某一内存空间中接收数据,再将处理后的结果,输出到某一内存空间。
2:
什么是输出流?
什么是输入流?
答:
在数据传输过程中,由若干字节组成的字节序列总是如流水一般从一个对象传送到另一个对象,因此将数据的传输过程形象地称为流(Stream)。
3:
cin称作 标准输入流对象 ,它对应 标准输入 设备
cout称作 标准输出流对象 ,它对应 标准输出 设备
使用它们必须包含头文件 iostream.h
4:
下列不正确的输出语句:
D
A.cout.put(‘a’).put(‘b’);
B.cout.put(‘a’)<
(‘b’);
C.cout<
‘a’<
‘b’;
D.cout<
‘a’.put(‘b’);
5:
编写程序实现下列要求
①使16进制数中的字母按大写输出
②用类ostream的成员函数put在一条语句中输出’O’、’K’两个字符
③用get()函数从键盘输入最多80个字符,存入字符数组str[100]中,若中间遇到终止符’$’时停止输入
④按右对齐方式、10位域宽显示1234
⑤使用流对象格式输出控制函数,按3位小数位输出1.92,-18.845,123.654,要求各行小数点要对齐显示(可参看练习9.1.1)。
solution-code/9-1-T5.cpp
扩展练习
学生问题汇总
(注:
汇总学生在学习过程中容易出现的问题)
教学后记
在此写上个人在授课过程中所遇到的教案中所没有涉及到的特殊问题及其解决方法或解决方案,也可以总结自己的授课体会,课程体系、教材的不足等。
授课教师(签名):
授课时间:
授课班级:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 91 C+中流的概念与层次结构 C+ 中流 概念 层次 结构