using namespace std;
string str{ "text" };
stringstream ss{ str };
cout.rdbuf(ss.rdbuf());
cout.flush(); //cout<<endl;
此代码应能打印文本,但不显示什么。
我将 ss 与 stdout 关联,然后刷新它,但是即使我引用了很多插图,我也不知道为什么它不起作用。
cout<<rdbuf(ss);
这没关系,但有何不同? :(
答案 0 :(得分:4)
我认为您误解了这个概念。线
cout.rdbuf(ss.rdbuf());
设置指向缓冲区的指针。它将cout
重定向到ss
而不是控制台。如果您写入cout
,它将被写入ss
。
我希望这可以为您清除
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::streambuf *backup;
backup = std::cout.rdbuf();
std::stringstream ss;
std::cout.rdbuf(ss.rdbuf());
std::cout << "Test" << std::endl;
std::cout.rdbuf(backup);
std::cout << ss.rdbuf();
return 0;
}
在示例代码中,我创建了cout
缓冲区的当前指针的副本。接下来,我将cout
重定向到ss
。当我写入cout
时,它会写入ss
的缓冲区中。接下来,我将cout
重定向回控制台并打印ss
的内容。
如果要操作缓冲区,则需要类似
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
int main() {
std::stringstream ss{ "test" };
std::stringbuf *pbuf = ss.rdbuf();
char buffer[80];
pbuf->sgetn (buffer,80);
std::streambuf *pbuf2 = std::cout.rdbuf();
pbuf2->sputn (buffer, std::strlen(buffer));
return 0;
}
答案 1 :(得分:2)
作为@Thomas Sablik答案的补充,以下是通过重定向流来打印“文本”的代码示例:
std::stringstream ss;
ss.basic_ios<char>::rdbuf(std::cout.rdbuf());
ss << "text";
std::cout.flush();
如果要将ss
的streambuf的内容复制到std::cout
,则可以直接使用插入器:
std::string str{ "text" };
std::stringstream ss{ str };
std::cout << ss.rdbuf();
std::cout.flush();