《C++程序设计语言》课件第15章_第1页
《C++程序设计语言》课件第15章_第2页
《C++程序设计语言》课件第15章_第3页
《C++程序设计语言》课件第15章_第4页
《C++程序设计语言》课件第15章_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第15章C++输入/输出系统基础15.1C++中的流概述15.2输出流15.3输入流15.4成员函数read和write的无格式输入/输出15.5流操纵算子小结练习题本章要点:

C++ 中的流;

C++ 输出流;

C++ 输入流;

C++ 流算子。

15.1C++ 中的流概述

和C的I/O系统一样,C++的I/O系统仍然是以字节流的形式实现的。流(Stream)实际上就是一个字节序列,它既可以从输入设备(如键盘(默认的标准输入设备)、磁盘、网络连接等)流向计算机内存,亦可以从计算机内存流向输出设备(显示器(默认的标准输出设备)、打印机、磁盘、网络连接等)。流是一种既能产生信息又可以消耗信息的逻辑设备,它通过I/O系统与一个物理设备相连。尽管流所连接的物理设备可以完全不同,但是所有的流以同样的方式工作,因此可以利用同样的I/O函数操作所有类型的物理设备。例如,可以利用同样的函数把信息写到文件、打印机或屏幕。输入/输出的字节可以是ASCII字符、内部格式的原始数据、图形图像、数字音频、数字视频或其它任何应用程序所需要的信息。

C++提供了低级和高级的I/O功能。低级I/O功能(即无格式的I/O)通常只在设备和内存之间传输一些字节。这种传输过程以单个字节为单位,它能进行高速、大容量的传输,但使用起来不够便利。

高级I/O(即格式化I/O)把若干个字节组合成某种类型(基本类型或自定义类型)的数据。这种面向类型的I/O更适合于大多数情况下的输入/输出,但在处理大容量的I/O时性能不如低级I/O。15.1.1C++的输入/输出流类库中的头文件

C++的输入/输出流类库提供了数百种I/O功能,其I/O流类库的接口部分包含在几个头文件中。

头文件<iostream>包含了操作所有输入/输出流所需的基本信息,因此在进行输入/输出时都应包含该头文件。另外,在<iostream>中定义了cin、cout、cerr和clog四个流对象,它们分别对应于标准输入流(键盘)、标准输出流(屏幕)、非缓冲和经缓冲的标准错误流,该头文件中还提供了无格式的I/O和格式化的I/O功能。在进行格式化的I/O时,如果流中带有含参数的流操纵算子(见本章后续内容),则必须包含<iomanip>头文件。

<cfstream>头文件中包含了由用户控制的文件处理操作。关于文件操作的内容本书不做介绍,有兴趣的读者可参阅相关文献资料。15.1.2输入/输出流类和对象

C++的输入/输出流类库中包含了许多用于处理I/O操作的类。其中,类istream支持流的输入操作,类ostream支持流的输出操作,类iostream同时支持流的输入和输出操作。

类istream和ostream是通过单重继承从基类ios类派生而来的。类iostream是通过多重继承从类istream和ostream派生而来的。在C++的I/O系统中,通过重载左移“<<”操作符(流插入运算符)提供了流的输出操作;通过重载的右移“>>”操作符(流读取运算符)提供了流的输入操作。这两个重载的运算符可以和标准流对象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所示。图15.1C++I/O系统类层次图

15.2输出流

C++的类ostream提供了无格式和格式化输出的功能,其中包括:用流插入运算符输出基本类型和string类型的数据;用成员函数put输出字符;用成员函数write进行无格式化的输出;输出十进制、八进制、十六进制格式的整数;输出各种精度的浮点数,输出强制带有小数点的浮点数以及用科学计数法和定点计数法表示的浮点数,输出在指定域宽内对齐的数据;输出在域宽内用指定字符填充空位的数据;输出科学计数法和十六进制计数法中的大写字母等。流插入运算符“<<”可实现流的输出。它可默认输出基本类型、string类型、char*类型的值。若需输出自定义类型对象的值,需在自定义类型中重载“<<”运算符(详见第13章操作符过载内容)。另外,“<<”运算符还可计算输出表达式的值。下面给出一个程序示例,以展示“<<”运算符的基本用法。程序运行输出结果:

WelcometoC++!

WelcometoC++!

i=10;d=3.14159;c=a;b=1;

23plus34is57

Thevalueofstris:test

Theaddressofstris:00417734

A

AB

15.3输入流

C++I/O系统的输入流类为istream。istream类提供了输入的基本操作。

15.3.1流读取运算符

在C++I/O系统中,输入一般是通过流读取运算符“>>”实现的。流读取运算符会跳过输入流中的空格、Tab键、换行符等空白字符。“>>”运算符默认可读取基本类型、string类型和char*类型的数据,若需要读取自定义类型的数据,需在自定义类型中过载流读取运算符“>>”(见第13章操作符过载中的相关内容)。“>>”一次可读取一个某种类型的数据,亦可连续使用,从左至右读取若干个类型的数据。由于输入流(istream)的父类(ios)过载了一个强制的类型转换运算符,它可将一个输入流类型转换成一个void*类型的指针,因此当读取数据发生错误或遇到输入结束时(如^z),指针值为0。利用这一特性,常常可以用类似cin>>x这样的表达式作为条件或循环语句中的逻辑判断条件。下面给出一个程序示例,以展示流读取运算符的基本用法。15.3.2用于输入的一些成员函数

下面讨论在C++的输入实例类中常用的一些成员函数。

get方法可从指定的输入流中读取一个字符,包括空白字符,并返回该字符。当遇到输入流中的文件结束符时,get方法返回EOF(文件结束符)。

get方法具有三种过载形式:

(1)不带参数的get。它从指定的输入流中读取一个字符(包括空白字符),并返回该字符。

(2)带一个参数的get。它从指定的输入流中读取下一个字符(包括空白字符),并返回该字符。

(3)带有三个参数的get。其参数分别是接收字符的字符数组、字符数组的大小和分隔符(默认为‘\n’)。它在读取比字符数组尺寸小1时结束,或者在遇到分隔符时结束。

getline用于从输入流中读取一字符串(包括空白字符)到一个string对象s中(如getline(cin,s))或字符数组buffer中(如cin.getline(buffer,size))。

由于用读取运算符“>>”读取字符串时遇到空白字符将停止读取,因此,需要读取整个字符串(包含空白字符)时常常采用getline方法。

ignore用于在需要时跳过输入流中指定数量的字符(默认个数是1),或遇到指定的分隔符(默认分隔符是EOF,使得ignore在读文件时跳过文件末尾)时结束。

putback方法将最后一次用get从输入流中提取的字符放回到输入流中。

成员函数peek返回输入流中的下一个字符,但并不将其从输入流中删除。

15.4成员函数read和write的无格式输入/输出

成员函数read和write可实现无格式的输入/输出。这两个函数分别用于将若干字节写入到字符数组或从字符数组中读出。这些字节都是未经过任何格式化的,仅以原始数据的形式输入或输出。

成员函数read将指定个数的字符输入到字符数组中。如果读取的字符个数少于指定的数目,可以设置标志位faibit(见本章后续内容)。

下面给出一个程序示例,以展示上述几个成员函数的基本功能。程序运行输出结果:

Enterasentence:

Iamateacher.

^Z

Thesentenceenteredwas:

Iamateacher.

15.5流 操 纵 算 子

采用cin、cout可进行各种类型对象的无格式输入或输出。若需进行格式化的输入/输出,需采用C++流类库中提供的各种输入/输出流操纵算子。流操纵算子具有如下功能:设置域宽,设置数值精度,设置和清除格式化,设置域填充字符,刷新流,在输出流中插入换行符并刷新该流,在输出流中插入空字符,跳过输入流中的空白字符,等等。下面简要介绍一下这些流操纵算子。15.5.1设置整数流的基数

在C++中,一个整数通常默认为是十进制的,如想改变流中整数的基数,可插入流操纵算子dec(恢复到十进制)、oct(设置成八进制)、hex(设置成十六进制)。这些流操纵算子定义在头文件<iostream>中。

也可以用流操纵算子setbase来改变基数。流操纵算子setbase带有一个参数10、8或16,表明所欲设置的进制。由于setbase带有参数,故常称其为参数化的操纵算子。本章的后续内容还会讲到一些参数化的操纵算子。使用参数化的操纵算子需包含头文件<iomanip>。15.5.2设置浮点数精度

在C++中可利用流操纵算子setprecision和成员函数percision来控制浮点数的精度。设置了精度以后,该精度对之后所有的浮点数输出都有效,直到下一次设置精度为止。无参数的成员函数percision返回当前设置的精度。

下面给出一个程序示例,以展示上述设置浮点数精度的操纵算子和成员函数的基本用法。

1.4142

1.41421

1.414214

1.4142136

1.41421356

1.414213562

Precisionsetbythesetprecisionmanipulator:

1

1.4

1.41

1.414

1.4142

1.41421

1.414214

1.4142136

1.41421356

1.41421356215.5.3设置输出域宽

可用流操纵算子setw(带参数的流操纵算子)和成员函数width进行输出域宽的设置。如果输出数据所需的宽度比设置的域宽小,则空位用填充字符进行填充;如果输出数据所需的宽度比设置的域宽大,则输出数据不会被截断,系统会输出所有的数据位。

注意:setw仅对一次输出流起作用。

下面给出一个程序示例,以展示流操纵算子setw和成员函数width的基本用法。小结

C++的I/O操作是以字节流的形式实现的。流实际上就是字节序列。头文件iostream.h包括了操作所有输入/输出所需的基本信息,因此在大多数C++程序中都应该包含这个头

文件。

C++提供了无格式I/O和格式化I/O两种操作。默认情况下,C++采用无格式的I/O;当需要格式化的输入/输出时,可采用带参数的流操作算子实现。头文件iomanip.h包含了带参数流算子的相关信息。在C++输入/输出类层次中,类istream支持流的输入操作,类ostream支持流的输出操作,类iostream同时支持流的输入与输出操作。类istream和ostream是通过单一继承从基类ios继承而来的。

流插入运算符“<<”可实现流的输出,它自动识别并输出C++中的基本类型及字符串类型的量。若欲输出自定义类型的量,在自定义类型中应重载该运算符。

流读取运算符“>>”可实现流的输入,它自动识别并输入C++中的基本类型及字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论