Contents|Index|Previous|Next

Simple output re-direction by redefining overflow

Suppose you have a function, write_to_window, that writes characters to a window object. If you want to use the ostream function to write to it, what follows is one (portable) way to do it. This depends on the default buffering (if any).

    #include <iostream.h>
    /* Returns number of characters successfully written to win.*/
    extern int write_to_window (window* win, char* text, int length);

    class windowbuf : public streambuf {
          window* win;
       public:
          windowbuf (window* w) { win = w; }
          int sync ();
          int overflow (int ch);
          // Defining xsputn is an optional optimization.
          // (streamsize was recently added to ANSI C++, not portable yet.)
          streamsize xsputn (char* text, streamsize n);
    };

    int windowbuf::sync ()
    { streamsize n = pptr () - pbase ();
      return (n && write_to_window (win, pbase (), n) != n) ? EOF : 0;
    }
    int windowbuf::overflow (int ch)
    { streamsize n = pptr () - pbase ();
          if (n && sync ())
             return EOF;
          if (ch != EOF)
           {
             char cbuf[1];
             cbuf[0] = ch;
             if (write_to_window (win, cbuf, 1) != 1)
                return EOF;
           }
          pbump (-n); // Reset pptr().
          return 0;
    }
    streamsize windowbuf::xsputn (char* text, streamsize n)
    { return sync () == EOF ? 0 : write_to_window (win, text, n); }

    int
    main (int argc, char**argv)
    {
       window *win = ...;
       windowbuf wbuf(win);
       ostream wstr(&wbuf);
       wstr << "Hello world!\n";
    }