是否可以将终端(以前)写入的内容(stdout)保存到字符串数组中:
vector<string> lines;
在不禁cin/cout
用正常功能的情况下,在 linux 控制台应用程序中。
在终端窗口中,除了字符之外,还有每个字符的着色信息。有没有办法将它们保存在另一个数组中?
是否可以将终端(以前)写入的内容(stdout)保存到字符串数组中:
vector<string> lines;
在不禁cin/cout
用正常功能的情况下,在 linux 控制台应用程序中。
在终端窗口中,除了字符之外,还有每个字符的着色信息。有没有办法将它们保存在另一个数组中?
如果您的意思是要在程序内部写入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";
}
这段代码并没有完全按照您的要求完成,但几乎是:您只需要以不同的方式处理换行符。完全缺少的是缓冲,它不需要获得功能而是获得性能。以上内容是在移动设备上输入的,可以证明有很多错别字,但该方法应该可以正常工作。