"内部"与"关联"流缓冲区之间的区别

Fel*_*bek 8 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?
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 4

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

\n

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

\n
stream.basic_ios::rdbuf(stream.rdbuf());\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
\n

该类basic_ifstream<charT, traits>支持读取命名文件。它使用一个basic_filebuf<charT, traits>对象来控制关联的序列。为了便于说明,此处将维护的数据表示为:

\n

\xe2\x80\x94 sbfilebuf对象。

\n
\n

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

\n

  • 是的,“fstream::rdbuf()”隐藏了*两个*“basic_ios::rdbuf”重载,因此您需要显式访问它们。 (3认同)