繁体   English   中英

在不禁用cout / cin的情况下获取stdout内容

[英]Getting stdout contents without disabling cout/cin

是否可以将终端(以前)写入的内容(stdout)保存到字符串数组中:

vector<string> lines;

在Linux控制台应用程序中无需禁用cin/cout正常功能。

在终端窗口中,除了字符外,每个字符都有着色信息。 有没有办法将它们保存在另一个数组中?

如果您要在程序内部编写std::cout并将数据同时显示在终端和某些程序内部数据结构中,则可以使用自定义流缓冲区。 这是一个简单的例子,看起来像这样:

#include <streambuf>
#include <iostream>

struct capturebuf
    : std::streambuf
{
    std::ostream&   d_out;
    std::streambuf* d_sbuf;
    std::string&       d_str;
public:
    capturebuf(std::ostream& out, std::string& str)
        : d_out(out)
        , d_sbuf(out.rdbuf())
        , d_str(str)
    {
        out.rdbuf(this);
    }
    ~capturebuf() {
        this->d_out.rdbuf(this->d_sbuf);
    }
    int overflow(int c) {
        if (c != std::char_traits<char>::eof()) {
            this->d_str.push_back(c);
        }
        return this->d_sbuf->sputc(c);
    }
    int sync() { return this->d_sbuf->pubsync(); }
};

上面的流缓冲区将只将每个字符添加到构造期间引用的字符串中。 字符也转发到传递的流缓冲区。 需要转发到pubsync()以确保基础流在适当的时间被刷新。

要实际使用它,您需要将其安装到std::cout 由于capturebuf的构造函数和析构函数已经进行了注册/注销,因此所需要做的就是构造一个相应的对象:

int main()
{
    std::string capture;
    {
        capturebuf buf(std::cout, capture);
        std::cout << "hello, world\n";
    }
    std::cout << "caught '" << capture << "'\n";
}

这段代码并不能完全满足您的要求,但是几乎可以做到:您只需要以不同的方式处理换行符即可。 完全缺少的是缓冲,它不是获得功能而是获得性能所必需的。 上面的内容是在移动设备上键入的,事实证明错字错综复杂,但是这种方法应该可以正常使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM