C++ - 刷新std::cout后没有得到结果

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

这段代码本来应该输出文本,但是却没有任何显示。
我将ssstdout关联起来,然后刷新它,但是即使我参考了很多说明,也不知道为什么它没有起作用。
cout<<rdbuf(ss);

这个是可以的,但是有什么不同呢? :(

2个回答

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
我想我知道为什么我误解了它。rdbuf == redirect_buffer,rdbuf != read_buffer。谢谢! - ZeBin Liu

2
作为对@Thomas Sablik答案的补充,以下是一个通过重定向流打印“text”的代码示例:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接