我試圖用一個boost::iostreamsoutput filter將字符串添加到開始,無論我流出來的結束。升壓輸入輸出流:output_filter只能一次
我的代碼下面的作品,但只在第一次;第二次,輸出似乎在某處丟失,寫入方法甚至不會被調用。我首先想到的是我將一些東西發送到觸發其失敗位的流,但流看起來不錯。
同樣的問題發生在mac和linux上,最新的boost release (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;
}