C ++-在刷新std :: cout之后不会得到结果

时间:2018-11-19 08:14:41

标签: c++ io stl std

using namespace std;
string str{ "text" };
stringstream ss{ str };
cout.rdbuf(ss.rdbuf());
cout.flush(); //cout<<endl;

此代码应能打印文本,但不显示什么

我将 ss stdout 关联,然后刷新它,但是即使我引用了很多插图,我也不知道为什么它不起作用。

cout<<rdbuf(ss);

这没关系,但有何不同? :(

2 个答案:

答案 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();

http://wordaligned.org/articles/cpp-streambufs