The GNU C++ Iostream Library - Overflow

Node: Overflow Next: Formatting Prev: Areas Up: Streambuf

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, here 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";
	}


Next: Formatting Up: Streambuf