首页 文章

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

提问于
浏览
8

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 回答

  • 2

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

    您始终可以通过致电重新启用它

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

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

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

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

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

相关问题