我正在尝试使用boost::iostreams 输出过滤器在我流出的任何内容的开头和结尾添加一个字符串。
我下面的代码有效,但只是第一次;第二次,输出似乎在某个地方丢失了,甚至似乎没有调用 write 方法。起初我以为我正在向触发其失败位的流发送一些东西,但流看起来不错。
同样的问题发生在 mac 和 linux 上,最新的boost 版本(1.48)和svn trunk,使用 cout 和文件接收器作为设备。
有人真的看过这个作品吗?那是一个错误吗?或者我在我的代码中做错了什么?
#include <iostream>
#include <sstream>
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/operations.hpp>
using std::cin;
using std::cout;
using std::endl;
using std::streamsize;
using std::string;
using std::stringstream;
class add_string_output_filter
: public boost::iostreams::multichar_output_filter
{
public:
template<typename Sink>
streamsize write(Sink& sink, const char* s, streamsize n)
{
string out_string = string(s);
// remove trailing '\0' to prevent line break
if (out_string[out_string.size()-1] == '\0')
out_string = out_string.substr(0, out_string.size()-1);
string pre_string("prepended string - ");
string app_string(" - appended string");
stringstream sstrm;
sstrm << pre_string << out_string << app_string << endl;
// TODO: char* to string, back to char* ?!?
return boost::iostreams::write(sink,
sstrm.str().c_str(),
sstrm.str().length());
}
};
int main()
{
boost::iostreams::filtering_ostream out;
out.push(add_string_output_filter());
out.push(cout);
// string #01 is printed,
// string #02 gets lost
out << "string #01" << endl;
out << "string #02" << endl;
}