【发布时间】:2019-11-16 01:23:03
【问题描述】:
这是一段简单的代码,它应该打印一个std::ostringstream 缓冲区,而缓冲区又是通过rdbuf() 获得的。我希望通过istreambuf 迭代器或直接通过<< 运算符将此缓冲区打印到std::cout。令人惊讶的是,没有任何东西可以打印这个缓冲区。更有趣的是,<< 运算符清除了这个缓冲区。
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
std::ostringstream buf_ref;
buf_ref << "bgdgdgdfg" << std::endl;
auto buff = buf_ref.rdbuf();
std::cout << "1 " << buf_ref.str() << std::endl;
std::copy(std::istreambuf_iterator<char>(buff), std::istreambuf_iterator<char>(), std::ostream_iterator<char>(std::cout));
std::cout << "2 " << buf_ref.str() << std::endl;
std::cout << buff << std::endl; /*Why it clears the buffer? Why it doesn't output anything?*/
std::cout << "3 " << buf_ref.str() << std::endl;
return 0;
}
有什么想法吗? BTS,这是描述
【问题讨论】:
-
大部分我都不太确定,但
buff应该是指向std::basic_stringbuf的指针,所以这实际上应该输出一个地址。 -
buff变量采用std::stringbuf*类型,因此,正如@n314159 所说,您会期望写入一个指针值。也许字符串流/字符串缓冲区指针有一个特定的重载。无论如何,这将起作用:std::cout << buff->str() << std::endl; -
不,这里是描述 cplusplus.com/reference/ostream/ostream/operator%3C%3C 重载的参考所以它应该是 streambuf 的内容