Oracle® Developer Studio 12.5:C++ 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

13.10 处理 streambuf

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

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

13.10.1 streambuf 指针类型

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

  • put 指针,它指向下一个字符的存储位置前面

  • get 指针,它指向要获取的下一个字符前面

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

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