以前有很多关于将stdout/stderr重定向到文件的问题.有没有办法将stdout/stderr重定向到字符串?
出于教育目的,我想创建一个ostream和流缓冲区来做:
我尝试过载,但失败的可怕.我试着通过写入来重载
ostream& write( const char* s, streamsize n )
Run Code Online (Sandbox Code Playgroud)
在我的basic_stringstream2类中(我复制粘贴basic_stringstream到我的cpp文件并修改它)但代码保持使用basic_ostream.我查看了代码,看起来我需要重载xsputn(这个页面上没有提到http://www.cplusplus.com/reference/iostream/ostream)但是我还需要重载多少?以及如何构建我的类(它需要继承什么等)?
我想使用Mr-Edd的iostreams文章中的这个片段在某处打印std :: clog.
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
int main()
{
std::ostringstream oss;
// Make clog use the buffer from oss
std::streambuf *former_buff =
std::clog.rdbuf(oss.rdbuf());
std::clog << "This will appear in oss!" << std::flush;
std::cout << oss.str() << '\\n';
// Give clog back its previous buffer
std::clog.rdbuf(former_buff);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,在一个主循环中,我会做类似的事情
while (! oss.eof())
{
//add to window text somewhere
}
Run Code Online (Sandbox Code Playgroud)
这是ostringstream文档,但我无法理解这样做的最佳方法.我有一个显示文本的方法,我只想用ostringstream中的任何数据调用它.
将发送到std :: clog的任何内容重定向到我选择的方法的最简单/最好的方法是什么?它是如上所述,并填写while!eof部分(不确定如何),或者是否有更好的方法,比如通过在调用我的方法的地方重载一些'commit'运算符?我喜欢快速简单,我真的不想开始定义接收器,就像文章那样使用boost iostreams - 这些东西已经超出了我的想象.
我有以下代码将我的std::cout输出重定向到日志文件.
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
Run Code Online (Sandbox Code Playgroud)
现在我想要的是,每当发生换行时,当前时间戳将被写入文件.
我知道我可以用以下方法实现:
std::cout << getTime() << "printing data" << std::endl;
Run Code Online (Sandbox Code Playgroud)
但我想要的是以std::cout某种方式自动处理它.那可能吗?