Sun Studio 12 Update 1:C++ 用户指南

14.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();

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