boost::iostreams 出力フィルターを使用して、ストリーム出力するものの最初と最後に文字列を追加しようとしています。
以下のコードは機能しますが、初回のみです。2 回目は、出力がどこかで失われたように見え、write メソッドが呼び出されていないようです。最初は、失敗ビットをトリガーする何かをストリームに送信していると思いましたが、ストリームは問題ないようです。
同じ問題は、最新のブースト リリース (1.48)とsvn トランクを使用し、デバイスとして cout とファイル シンクを使用するmac と linux でも発生します。
この作品を実際に見た人はいますか?それはバグですか?または、コードで何か間違ったことをしていますか?
#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;
}