JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

13.1 预定义的 iostream

13.2 iostream 交互的基本结构

13.3 使用传统 iostream

13.3.1 使用 iostream 进行输出

13.3.1.1 定义自己的插入运算符

13.3.1.2 处理输出错误

13.3.1.3 刷新

13.3.1.4 二进制输出

13.3.2 使用 iostream 进行输入

13.3.3 定义自己的提取运算符

13.3.4 使用 char* 提取器

13.3.5 读取任何单一字符

13.3.6 二进制输入

13.3.7 查看输入

13.3.8 提取空白

13.3.9 处理输入错误

13.3.10 结合使用 iostreamstdio

13.4 创建 iostream

13.4.1 使用类 fstream 处理文件

13.4.1.1 打开模式

13.4.1.2 在未指定文件的情况下声明 fstream

13.4.1.3 打开和关闭文件

13.4.1.4 使用文件描述符打开文件

13.4.1.5 在文件内重新定位

13.5 iostream 赋值

13.6 格式控制

13.7 操纵符

13.7.1 使用无格式操纵符

13.7.2 参数化操纵符

13.8 strstream:用于数组的 iostream

13.9 stdiobuf:用于 stdio 文件的 iostream

13.10 处理 streambuf

13.10.1 streambuf 指针类型

13.10.2 使用 streambuf 对象

13.11 iostream 手册页

13.12 iostream 术语

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

13.10 处理 streambuf

iostream 是由两部分(输入或输出)构成的系统的格式化部分。系统的其他部分由 streambuf 流组成,这些流处理无格式字符流的输入或输出。

通常,可以通过 iostream 使用 streambuf 流,因此您不需要详细了解它们。也可以直接使用 streambuf 流,例如,当您需要提高效率,或者需要绕开 iostream 中内置的错误处理或格式设置时。

13.10.1 streambuf 指针类型

streambuf 由字符流或字符序列和一个或两个指向相应序列的指针组成。每个指针都指向两个字符间。(实际上,指针无法指向字符之间,但可以按这种方式理解指针。)有两种 streambuf 指针:

streambuf 可以有其中一个指针,也可以两个全有。

可以使用多种方法来操作指针的位置和序列的内容。操作两个指针时它们是否都会移动取决于使用 streambuf 的种类。通常,使用队列式 streambuf 流时,get 和 put 指针独立移动。使用文件式 streambuf 流时,get 和 put 指针始终一起移动。例如,strstream 是队列式流,fstream 是文件式流。

13.10.2 使用 streambuf 对象

从来不创建实际的 streambuf 对象,而是只创建从 streambuf 类派生的类的对象。示例有 filebufstrstreambuffilebuf(3CC4) 和 ssbuf(3) 手册页中对它们进行了介绍。高级用户可能想从 streambuf 派生自己的类,以便提供特定设备的接口或提供基本缓冲以外的功能。sbufpub(3CC4) 和 sbufprot(3CC4) 手册页中讨论了如何执行此操作。

除了创建自己的特殊种类的 streambuf 外,您可能还想通过访问与 iostream 关联的 streambuf 来访问公用成员函数(如以上手册页中所述)。此外,每个 iostream 都有采用 streambuf 指针的已定义插入器和提取器。插入或提取 streambuf 时,会复制整个流。

以下示例显示了可用来执行之前讨论的文件复制的另一种方法,为提高清晰性,该方法中省略了错误检查:

ifstream fromFile("thisFile");
ofstream toFile ("thatFile");
toFile << fromFile.rdbuf();

如之前一样打开输入和输出文件。每个 iostream 类都有成员函数 rdbuf,它返回指向与其关联的 streambuf 对象的指针。如果是 fstream,则 streambuf 对象是类型 filebuf。与 fromFile 关联的整个文件都复制到(插入)与 toFile 关联的文件。最后一行也可以改写如下:

fromFile >> toFile.rdbuf();

然后源文件被提取到目标中。两种方法是完全等同的。