Doubling a stream
Doubling a stream
我使用cerr流作为错误输出,但我也想将这些错误输出保存在内存中的stringstream中。
I'm looking to turn this:
stringstream errorString;
cerr << " Something went wrong ";
errorString << " Something went wrong ";
到
myErr << " Something went wrong ";
其中myErr是一个类的实例,它将这个值存储在stringstream中,并输出给cerr。
谢谢你的帮助
您可以像这样创建myErr
类的类型:
class stream_fork
{
std::ostream& _a;
std::ostream& _b;
public:
stream_fork( std::ostream& a, std::ostream& b)
: _a( a ),
_b( b )
{
}
template<typename T>
stream_fork& operator<<( const T& obj )
{
_a << obj;
_b << obj;
return *this;
}
// This lets std::endl work, too!
stream_fork& operator<<( std::ostream& manip_func( std::ostream& ) )
{
_a << manip_func;
_b << manip_func;
return *this;
}
};
用法:
stream_fork myErr( std::cerr, errorString );
myErr << "Error Message" << std::endl;
你可以使用Boost.IOStreams.
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>
#include <sstream>
namespace io = boost::iostreams;
int main() {
std::stringstream ss;
io::tee_device<decltype(ss), decltype(std::cerr)> sink(ss, std::cerr);
io::stream<decltype(sink)> stream(sink);
stream << "foo" << std::endl;
std::cout << ss.str().length() << std::endl;
return 0;
}
在MyErr
类中覆盖operator<<
MyErr& operator<< ( MyErr& myErr, std::string message)
{
cerr << message;
errorString << message; //Where errorString is a member of the MyErr class
return myErr;
}
在你想记录错误的地方:
int main()
{
MyErr myErr;
myErr << " Something went wrong. ";
return 0;
}
你可能想让MyErr
一个单例类,这样所有写到errorString
的东西都在一个地方。
使用Boost tee
您需要子类streambuf
并将myErr
声明为使用您的子类的ostream
。让输入函数什么都不做,然后让输出函数复制到你需要的任何流中。
12年前我有一个班级做过类似的事情,但我已经忘记了。我没能找到一个很好的例子,但是streambuf的文档可以作为一个起点。注意保护的输出功能
相关文章:
- 为什么stream::忽略未按预期工作
- OpenCV RTP-Stream with FFMPEG
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 在 Stream C++ 文本之前有一个额外的换行符
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- 测试"stream >> char"有什么作用?
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- cv::cuda::Stream选择线程默认流
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- Boost::Beast Websocket Bidirection Stream (C++)
- 实现可以<T>转换为 Stream 的 Stream,<U>其中 U 是 T 的基数
- AWS CPP TransferManager vs GetObjectRequest Stream to File f
- '&'在"std::vector<byte>& stream;"中代表什么
- 由mpglib输出的"hip: Can't rewind stream by 74 bits"到底意味着什么?
- Using boost::asio::async_wait_until with boost::asio::stream
- 当 stream.peek()=='' 时,流>> z1 有什么用
- git_remote_fetch返回错误并显示消息:"there is no TLS stream available"
- 检测在ofstream写入过程中的空间不足,stream.fail()无法正常工作
- Doubling a stream