gpt4 book ai didi

c++ - 在不禁用 cout/cin 的情况下获取标准输出内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:06 24 4
gpt4 key购买 nike

是否可以将终端(以前)写入的内容(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";
}

这段代码并没有完全按照您的要求进行,但差不多:您只需要以不同的方式处理换行符。完全缺少的是缓冲,它不是获得功能所必需的,而是获得性能所必需的。上面的内容是在移动设备上输入的,可以证明存在很多拼写错误,但该方法应该可以正常工作。

关于c++ - 在不禁用 cout/cin 的情况下获取标准输出内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18631518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com