【问题标题】:Difference between "internal" vs "associated" stream buffer“内部”与“关联”流缓冲区之间的区别
【发布时间】:2018-09-10 12:04:18
【问题描述】:

来自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?

【问题讨论】:

  • 但是,ifstream::rdbuf() 返回的不是对象当前使用的缓冲区是不是真的违反直觉?
  • 这就是ios::rdbuf 的用途。
  • @FelixDombek 我还没有读完你的问题,但如果你问关于 iostream 的某些事情是否违反直觉,答案可能是肯定的。如果下一个答案是彻底重新设计是否会使其变得更好,那么答案是肯定的。

标签: c++ iostream streambuf


【解决方案1】:

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

您可以随时通过调用重新启用它

stream.basic_ios::rdbuf(stream.rdbuf());

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

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

basic_ifstream&lt;charT, traits&gt; 类支持从命名文件中读取。它使用basic_filebuf&lt;charT, traits&gt; 对象来控制关联的序列。为了便于说明,这里将维护的数据表示为:

——sbfilebuf 对象。

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

【讨论】:

  • “内部流缓冲区”可能比“维护数据”更容易理解和直观
  • 谢谢!真的需要basic_ios:: 部分吗?
  • 是的,fstream::rdbuf() 隐藏了 both basic_ios::rdbuf 重载,因此您需要显式访问它们。
  • 那么如果我们不手动改变关联流缓存,内部流缓存和关联流缓存一样吗?
  • @xskxzr 是的
猜你喜欢
  • 2019-10-14
  • 2016-12-01
  • 1970-01-01
  • 2021-10-06
  • 2018-04-13
  • 2014-11-07
  • 2019-07-07
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多