【发布时间】: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 的某些事情是否违反直觉,答案可能是肯定的。如果下一个答案是彻底重新设计是否会使其变得更好,那么答案是肯定的。