Oracle Solaris Studio 12.2:C++ 用户指南

13.10 streambuf

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

通常,可以通过 iostream 使用 streambuf,因此,不必担心 streambuf 的细节。您可以选择直接使用 streambuf,例如,如果需要提高效率或解决 iostream 内置的处理或格式化错误。

13.10.1 streambuf 工作方式

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

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

13.10.1.1 指针位置

可以使用多种方法来操作指针的位置和序列的内容。操作两个指针时它们是否都会移动取决于使用 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();

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