当前位置: 首页 > >

C++语言程序设计第9章 流类库与输入输出

发布时间:

第9章 流类库与输入输出 ? ? ? ? ? ? 9.1 I/O流的概念及流类库结构 9.2 输出流 9.3 输入流 9.4 输入输出流 9.5 综合实例 9.6 知识扩展 9.1 I/O流的概念及流类库结构 ? 9.1.1 I/O流的概念 ? 9.1.2 流类库结构 9.1.1 I/O流的概念 ? C++的I/O流由若干字节组成的字节序列,在输入 操作时,字节流从输入设备(如键盘、磁盘)流 向内存,称为输入流;在输出操作时,字节流从 内存流向输出设备(如显示器、打印机、磁盘等 ),称为输出流。流中的内容可以是ASCII字符、 二进制形式的数据、图形图像、数字音频视频或 其它形式的信息。 ? 输入操作在流数据抽象中被称为(从流中)提取 ,“>>”是预定义的提取符。 ? 输出操作被称为(向流中)插入,“<<”是预定 义的插入符。 ? 在c++中,I/O流被定义为类,IO库中的类 称为流类(stream class),用流类定义的 对象称为流对象。头文件iostream中声明了 4个预定义的流对象用来完成在标准设备上 的输入输出操作。 – cin 用来处理标准输入,即键盘输入 – cout 用来处理标准输出,即屏幕输出 – cerr 标准错误输出流,没有缓冲,发送给它 的内容立即被输出。 – clog 类似于cerr,有缓冲,缓冲区满时被输 出。 ? 程序运行时,在内存中为每一个数据流开 辟一个内存缓冲区,用来存放流中的数据 。例如当用cout和插入运算符“<<”向显 示器输出数据时,先将数据送入内存输出 缓冲区保存,直到缓冲区满了或遇到endl, 就将缓冲区中的全部数据送到显示器显示 ;当用cin和提取运算符“>>”从键盘输入 数据时,键盘输入的数据先放着键盘的缓 冲区中,当按回车键时,键盘缓冲区中的 数据送入内存输入缓冲区形成cin流,然后 提取运算符“>>”从输入缓冲区提取数据 送给程序中的变量。 9.1.2 流类库结构 ? I/O流类库是用继承方法建立起来的一个输 入输出类库,它有两个*行的基本类: streambuf类和ios类,所有的流类都可以由 它们派生出来。 ? 1 streambuf类 – streambuf类提供物理设备的接口,它提供缓冲或处理 流的通用方法,几乎不需要任何格式。缓冲区由一个 字符序列和两个指针组成,这两个指针是输入缓冲区 指针和输出缓冲区指针,它们分别指向字符要被插入 或取出的位置。filebuf、stringstreambuf是它的派生类 ,其成员函数大多采用内置函数方式定义,以提高效 率。 – filebuf类使用文件来保存缓冲区中的字符序列。当读文 件时,实际上是将指定文件中的内容读入缓冲区;当 写文件时,实际是将缓冲区的字符写到指定的文件中 。 – stringstreambuf类扩展了streambuf类的功能,它提供 了在内存中进行提取和插入操作的缓冲区管理。 ? 2 ios类 – ios类是一个虚基类,它主要定义了用于格式化 输入输出以及出错处理的成员函数。在ios类和 它的各级派生类中,均含有一个指向流缓冲类 streambuf的对象的指针。ios类及其派生类使 用streambuf以及从它派生的文件缓冲类filebuf 和字符缓冲类strstreambuf进行输入输出。 – ios类的基础是一组类模板,类模板中提供了库 中的大多数功能,而且可以作用于不同类型的 元素。使用I/O流时一般无须直接引用这些模板 ,因为C++的标准头文件中已经用typedef为这 些模板的实例定义了别名。 9.2 输出流 ? 一个输出流对象是信息流动的目标,最重 要的三个输出流是: – ostream类:用来向标准设备的输出,预先定义 的ostream输出流对象有:cout、cerr 、clog – ofstream类:支持磁盘文件输出,可以接收二进 制或文本模式数据。 – ostringstream类:字符串输出,用于生成字符 串 ? 【例9.1】 cout 、cerr区别。 #include <iostream> #include<stdlib.h> using namespace std; int main() { cout<<hello <<endl; cerr<<hello world<<endl; system(pause); } ? 将例9-1编译形成项目可执行文件9_1.exe,在命令提示符状态 分别输入两个命令: ? “9_1 >t1.txt”和“9_1 2>t2.txt”,分别查看t1.txt和t2.txt可 以看出不同。 9.2.1 插入运算符(<<)和操纵符 ? 插入(<<)运算符是所有标准C++数据类型预先设计的,用 于传送字节到一个输出流对象。 ? 很多情况下,程序员需要控制输入输出格式。C++提供了 两种格式控制方法:一种方法是使用ios类中有关格式控 制的成员函数;另一种是使用预先定义的操纵符一起工作 。下面重点讲述操纵符。 ? C++预定义的操纵符分为带参数的操纵符和不带参数的操 纵符。通常,不带参数的操纵符在iostream文件中,而带 参数的操纵符在iomanip文件中定义。在进行输入输出时 ,操纵符被嵌入到输入或输出链中,用来控制输入输出的 格式。程序中如果使用带参数的操纵符,还必须使用预编 译命令: ? #include <iomanip> ? 1控制输出宽度和填充字符 – (1)使用成员函数控制输出宽度和填充字符 – 为了调整输出,可以通过调用width成员函数为每个 项指定输出宽度,配合fill成员函数可以设置填充的 内容。width成员函数仅影响紧随其后的域,在一个 域输出完后域宽度恢复默认值,fill成员函数可以保 持有效直到发生改变。大家比较例9-2四种格式的不 同。 ? 【例9.2】 使用成员函数控制输出宽度和填充格式 #include <iostream> using name



友情链接: