“内部”与“关联”流缓冲区

时间:2018-03-31 19:19:43

标签: c++ iostream streambuf

来自http://www.cplusplus.com/reference/ios/ios/rdbuf/

  

某些派生的流类(例如stringstream和fstream)维护自己的内部流缓冲区,它们在构造时与之关联。调用此函数来更改关联的流缓冲区内部流缓冲区没有影响:流将具有关联的流缓冲区,这是与内部流缓冲区不同(尽管流上的输入/输出操作始终使用关联的流缓冲区,由此成员函数返回)。

http://www.cplusplus.com/reference/fstream/ifstream/rdbuf/上:

  

返回指向内部filebuf对象的指针。

     

但请注意,这不一定与当前关联的流缓冲区(由ios :: rdbuf返回)相同。

那么如果没有用于输入和输出操作,内部缓冲区是什么?如果这意味着这两行可以返回两个不同的对象,为什么这有用呢?

std::stringstream ss;
ss.rdbuf();                          // (1) returns "internal" stream buffer?
static_cast<std::ios&>(ss).rdbuf();  // (2) returns "associated" stream buffer?

1 个答案:

答案 0 :(得分:2)

内部缓冲区用于输入和输出操作,直到用其他参数调用rdbuf。然后就坐在那里。

您可以随时通过调用

重新启用它
stream.basic_ios::rdbuf(stream.rdbuf());

请注意内部缓冲区,例如std::fstream始终是由流对象拥有和管理的std::filebuf对象,而关联的缓冲区可以是任何streambuf派生对象。流只存储一个指向它的基类指针,并且不管理它的生命周期。

另请注意,标准不使用术语“内部缓冲区”。该标准使用了一些不同的术语:

  

basic_ifstream<charT, traits>支持从命名文件中读取。它使用basic_filebuf<charT, traits>对象来控制相关序列。为了便于说明,维护的数据在此处显示为:

     

- sbfilebuf对象。

上面的“维护数据”是cplusplus.com所谓的“内部流缓冲区”。