Boost logo

Boost Users :

Subject: [Boost-users] [iostreams] multichar_output_filter works only the first time
From: Steven Samuel Cole (steven.samuel.cole_at_[hidden])
Date: 2012-02-09 11:43:41


hello,

to get started with iostreams, i'm trying to write a multichar output
filter that adds a string to the beginning and the end of whatever comes
through. my code builds with a warning about unused parameter n and
works - but only the first time, the second time, i get no output.

i thought at first sending '\0' would trigger the stream's fail-bit or
so, but out.good() returns true.

any chance someone takes a look at my code and hazards a guess where the
problem might be ?

disclaimer: i was actually born and bred in C++ country long time ago,
but i've been coding in python for a couple of years and got back only
recently, so there's a good chance what i'm doing wrong is something
really simple. guess you can tell from the code, it's been a while. good
to be back though... :-)

#include <iostream>
#include <sstream>

#include <boost/iostreams/concepts.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)
     {
         // remove trailing '\0' to prevent line break
         // TODO: there's probably a better way
         string tmp_string = string(s);
         string out_string = tmp_string.substr(0, tmp_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);

     cout << "prompt: ";

     string str;
     while (getline(cin, str))
     {
         out << str << endl;
         cout << "prompt: ";
     }
}

# sample session:

prompt: some string
prepended string - some string - appended string
prompt: another string
prompt: why no output ?
prompt:

# ssc


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net