是否有可能节省终端(先前)写入的内容(标准输出),以一个字符串数组:
vector<string> lines;
没有禁用cin/cout
正常功能,在Linux控制台应用程序。
在除了字符的终端窗口有一个为每个字符的着色信息。 有没有办法将它们保存在另一个数组?
是否有可能节省终端(先前)写入的内容(标准输出),以一个字符串数组:
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";
}
此代码并不完全做你问什么,但近:你只需要以不同的方式处理换行符。 什么是完全丢失是不是需要得到功能,但得到的性能缓冲。 上述被输入在移动设备上,是与错别字可证明千疮百孔但是这种方法应该工作原样。