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";
}
Top|Contents|Index|Previous|Next