C++程序设计语言(李雁妮) 第15章

上传人:E**** 文档编号:89370959 上传时间:2019-05-24 格式:PPT 页数:41 大小:441KB
返回 下载 相关 举报
C++程序设计语言(李雁妮) 第15章_第1页
第1页 / 共41页
C++程序设计语言(李雁妮) 第15章_第2页
第2页 / 共41页
C++程序设计语言(李雁妮) 第15章_第3页
第3页 / 共41页
C++程序设计语言(李雁妮) 第15章_第4页
第4页 / 共41页
C++程序设计语言(李雁妮) 第15章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C++程序设计语言(李雁妮) 第15章》由会员分享,可在线阅读,更多相关《C++程序设计语言(李雁妮) 第15章(41页珍藏版)》请在金锄头文库上搜索。

1、第15章 C+ 输入/输出系统基础,15.1 C+ 中的流概述 15.2 输出流 15.3 输入流 15.4 成员函数read和write的无格式输入/输出 15.5 流操纵算子 小结 练习题,本章要点: C+ 中的流; C+ 输出流; C+ 输入流; C+ 流算子。,15.1 C+ 中的流概述 和C的I/O系统一样,C+的I/O系统仍然是以字节流的形式实现的。流(Stream)实际上就是一个字节序列,它既可以从输入设备(如键盘(默认的标准输入设备)、磁盘、网络连接等)流向计算机内存,亦可以从计算机内存流向输出设备(显示器(默认的标准输出设备)、打印机、磁盘、网络连接等)。流是一种既能产生信息

2、又可以消耗信息的逻辑设备,它通过I/O系统与一个物理设备相连。尽管流所连接的物理设备可以完全不同,但是所有的流以同样的方式工作,因此可以利用同样的I/O函数操作所有类型的物理设备。例如,可以利用同样的函数把信息写到文件、打印机或屏幕。,输入/输出的字节可以是ASCII字符、内部格式的原始数据、图形图像、数字音频、数字视频或其它任何应用程序所需要的信息。 C+提供了低级和高级的I/O功能。低级I/O功能(即无格式的I/O)通常只在设备和内存之间传输一些字节。这种传输过程以单个字节为单位,它能进行高速、大容量的传输,但使用起来不够便利。 高级I/O(即格式化I/O)把若干个字节组合成某种类型(基本

3、类型或自定义类型)的数据。这种面向类型的I/O更适合于大多数情况下的输入/输出,但在处理大容量的I/O时性能不如低级I/O。,15.1.1 C+的输入/输出流类库中的头文件 C+的输入/输出流类库提供了数百种I/O功能,其I/O流类库的接口部分包含在几个头文件中。 头文件包含了操作所有输入/输出流所需的基本信息,因此在进行输入/输出时都应包含该头文件。另外,在中定义了cin、cout、cerr和clog四个流对象,它们分别对应于标准输入流(键盘)、标准输出流(屏幕)、非缓冲和经缓冲的标准错误流,该头文件中还提供了无格式的I/O和格式化的I/O功能。,在进行格式化的I/O时,如果流中带有含参数的

4、流操纵算子(见本章后续内容),则必须包含头文件。 头文件中包含了由用户控制的文件处理操作。关于文件操作的内容本书不做介绍,有兴趣的读者可参阅相关文献资料。,15.1.2 输入/输出流类和对象 C+的输入/输出流类库中包含了许多用于处理I/O操作的类。其中,类istream支持流的输入操作,类ostream支持流的输出操作,类iostream同时支持流的输入和输出操作。 类istream和ostream是通过单重继承从基类ios类派生而来的。类iostream是通过多重继承从类istream和ostream派生而来的。在C+的I/O系统中,通过重载左移“”操作符(流读取运算符)提供了流的输入操作

5、。这两个重载的运算符可以和标准流对象cin(istream类对象)、cout(ostream类对象)、cerr(ostream类带缓冲的错误流对象)和clog(ostream类不带缓冲的流对象)以及自定义类型的对象一起使用。,C+中的文件处理用类ifstream完成文件的输入操作,用类ofstream完成文件的输出操作,用类fstream完成文件的输入/输出操作。 在C+的I/O系统中还有相当多的类用于支持流的I/O操作,但这里所列出的类能够实现多数程序所需要的绝大部分功能。若想更多地了解C+的I/O系统,请参看C+类库指南或其它相关文献资料。C+I/O系统的类的继承层次如图15.1所示。,图

6、15.1 C+ I/O系统类层次图,15.2 输 出 流 C+的类ostream提供了无格式和格式化输出的功能,其中包括:用流插入运算符输出基本类型和string类型的数据;用成员函数put输出字符;用成员函数write进行无格式化的输出;输出十进制、八进制、十六进制格式的整数;输出各种精度的浮点数,输出强制带有小数点的浮点数以及用科学计数法和定点计数法表示的浮点数,输出在指定域宽内对齐的数据;输出在域宽内用指定字符填充空位的数据;输出科学计数法和十六进制计数法中的大写字母等。,流插入运算符“”可实现流的输出。它可默认输出基本类型、string类型、char*类型的值。若需输出自定义类型对象的

7、值,需在自定义类型中重载“”运算符(详见第13章操作符过载内容)。另外,“”运算符还可计算输出表达式的值。下面给出一个程序示例,以展示“”运算符的基本用法。,程序运行输出结果: Welcome to C+! Welcome to C+! i=10; d=3.14159; c=a; b=1; 23 plus 34 is 57 The value of str is: test The address of str is: 00417734 A A B,15.3 输 入 流 C+I/O系统的输入流类为istream。istream类提供了输入的基本操作。 15.3.1 流读取运算符 在C+I/O系

8、统中,输入一般是通过流读取运算符“”实现的。流读取运算符会跳过输入流中的空格、Tab键、换行符等空白字符。“”运算符默认可读取基本类型、string类型和char*类型的数据,若需要读取自定义类型的数据,需在自定义类型中过载流读取运算符“”(见第13章操作符过载中的相关内容)。,“”一次可读取一个某种类型的数据,亦可连续使用,从左至右读取若干个类型的数据。由于输入流(istream)的父类(ios)过载了一个强制的类型转换运算符,它可将一个输入流类型转换成一个void*类型的指针,因此当读取数据发生错误或遇到输入结束时(如z),指针值为0。利用这一特性,常常可以用类似cinx这样的表达式作为条

9、件或循环语句中的逻辑判断条件。下面给出一个程序示例,以展示流读取运算符的基本用法。,15.3.2 用于输入的一些成员函数 下面讨论在C+的输入实例类中常用的一些成员函数。 get方法可从指定的输入流中读取一个字符,包括空白字符,并返回该字符。当遇到输入流中的文件结束符时,get方法返回EOF(文件结束符)。 get方法具有三种过载形式: (1) 不带参数的get。它从指定的输入流中读取一个字符(包括空白字符),并返回该字符。 (2) 带一个参数的get。它从指定的输入流中读取下一个字符(包括空白字符),并返回该字符。,(3) 带有三个参数的get。其参数分别是接收字符的字符数组、字符数组的大小

10、和分隔符(默认为n)。它在读取比字符数组尺寸小1时结束,或者在遇到分隔符时结束。 getline用于从输入流中读取一字符串(包括空白字符)到一个string对象s中(如getline(cin, s)或字符数组buffer中(如cin.getline(buffer, size)。 由于用读取运算符“”读取字符串时遇到空白字符将停止读取,因此,需要读取整个字符串(包含空白字符)时常常采用getline方法。,ignore用于在需要时跳过输入流中指定数量的字符(默认个数是1),或遇到指定的分隔符(默认分隔符是EOF,使得ignore在读文件时跳过文件末尾)时结束。 putback方法将最后一次用ge

11、t从输入流中提取的字符放回到输入流中。 成员函数peek返回输入流中的下一个字符,但并不将其从输入流中删除。,15.4 成员函数read和write的无格式输入/输出 成员函数read和write可实现无格式的输入/输出。这两个函数分别用于将若干字节写入到字符数组或从字符数组中读出。这些字节都是未经过任何格式化的,仅以原始数据的形式输入或输出。 成员函数read将指定个数的字符输入到字符数组中。如果读取的字符个数少于指定的数目,可以设置标志位faibit(见本章后续内容)。 下面给出一个程序示例,以展示上述几个成员函数的基本功能。,程序运行输出结果: Enter a sentence: I a

12、m a teacher. Z The sentence entered was: I am a teacher.,15.5 流 操 纵 算 子 采用cin、cout可进行各种类型对象的无格式输入或输出。若需进行格式化的输入/输出,需采用C+流类库中提供的各种输入/输出流操纵算子。流操纵算子具有如下功能:设置域宽,设置数值精度,设置和清除格式化,设置域填充字符,刷新流,在输出流中插入换行符并刷新该流,在输出流中插入空字符,跳过输入流中的空白字符,等等。下面简要介绍一下这些流操纵算子。,15.5.1 设置整数流的基数 在C+中,一个整数通常默认为是十进制的,如想改变流中整数的基数,可插入流操纵算子

13、dec(恢复到十进制)、oct(设置成八进制)、hex(设置成十六进制)。这些流操纵算子定义在头文件中。 也可以用流操纵算子setbase来改变基数。流操纵算子setbase带有一个参数10、8或16,表明所欲设置的进制。由于setbase带有参数,故常称其为参数化的操纵算子。本章的后续内容还会讲到一些参数化的操纵算子。使用参数化的操纵算子需包含头文件。,15.5.2 设置浮点数精度 在C+中可利用流操纵算子setprecision和成员函数percision来控制浮点数的精度。设置了精度以后,该精度对之后所有的浮点数输出都有效,直到下一次设置精度为止。无参数的成员函数percision返回当

14、前设置的精度。 下面给出一个程序示例,以展示上述设置浮点数精度的操纵算子和成员函数的基本用法。,1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562 Precision set by the setprecision manipulator: 1 1.4 1.41 1.414,1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562,15.5.3 设置输出域宽 可用流操纵算子setw(带参数的流操纵算子)和成员函数width进行输出域宽的设置。如果输出数据所需的宽度比设置的域宽小

15、,则空位用填充字符进行填充;如果输出数据所需的宽度比设置的域宽大,则输出数据不会被截断,系统会输出所有的数据位。 注意:setw仅对一次输出流起作用。 下面给出一个程序示例,以展示流操纵算子setw和成员函数width的基本用法。,小 结 C+的I/O操作是以字节流的形式实现的。流实际上就是字节序列。头文件iostream.h包括了操作所有输入/输出所需的基本信息,因此在大多数C+程序中都应该包含这个头 文件。 C+提供了无格式I/O和格式化I/O两种操作。默认情况下,C+采用无格式的I/O;当需要格式化的输入/输出时,可采用带参数的流操作算子实现。头文件iomanip.h包含了带参数流算子的

16、相关信息。,在C+输入/输出类层次中,类istream支持流的输入操作,类ostream支持流的输出操作,类iostream同时支持流的输入与输出操作。类istream和ostream是通过单一继承从基类ios继承而来的。 流插入运算符“”可实现流的输入,它自动识别并输入C+中的基本类型及字符串类型的量。若欲输入自定义类型的量,在自定义类型中需重载该运算符。,类istream的一个对象是cin,它与标准输入设备(默认为键盘)关联在一起。 类ostream的一个对象是cout,它与标准输出设备(默认为显示器)关联在一起。类ostream的另一个对象是cerr,它与标准错误输出设备关联在一起。对象cerr实现非缓冲输出,它将系统中的每一条错误信息立即显示出来。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号