[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
Re: Log class problems
OK.
Take a look at
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1basic__streambuf.html#std_1_1basic__streambufb3
See what base class version of overflow does...
Alexey Parshin wrote:
>Since the attachment doesn't work - sending it directly
>
>//#include "stdafx.h"
>#include <iostream>
>#include <strstream>
>
>using namespace std;
>
>class CLogStreamBuf : public streambuf {
> iostream *m_parent;
> char *m_start;
> char *m_end;
> char *m_buffer;
>protected:
> virtual int_type overflow(int_type c);
> virtual streamsize xsputn(const char_type* s, streamsize n);
>public:
> CLogStreamBuf() {
> m_buffer = new char[16];
> setbuf(m_buffer,16);
> }
> ~CLogStreamBuf() {
> cout << "Destructor" << endl;
> delete m_buffer;
> }
>};
>
>class CLog : public iostream {
> CLogStreamBuf m_buffer;
>public:
> CLog() : iostream(&m_buffer),ios(0) {}
> ~CLog() { flush(); }
>};
>
>streambuf::int_type CLogStreamBuf::overflow(streambuf::int_type c) {
> int bytes = pptr() - pbase();
> cout << "in overflow, char = '" << char(c) << "' " << c << " - was " <<
>bytes << " bytes" << endl;
> streambuf::int_type rc = streambuf::overflow(c);
> return rc;
>}
>
>streamsize CLogStreamBuf::xsputn(const char_type* s, streamsize n) {
> int bytes = pptr() - pbase();
> char *buff = new char[n+1];
> strncpy(buff,s,n); buff[n] = 0;
> cout << "in xsputn, str = " << buff << " - was " << bytes << " bytes" <<
>endl;
> delete buff;
> streamsize rc = streambuf::xsputn(s,n);
>
> while ( sgetc() != EOF ) {
> char ch = sbumpc();
> //if (ch == 10) cout << endl;
> //else
> if (ch >= 10)
> cout << ch;
> }
> return rc;
>}
>
>int main(int argc,char *argv[]) {
> CLog cl;
> for (unsigned i = 0; i < 4; i++)
> cl << "line" << i << " " << 12345 << " out " << endl << endl;
>}
>
>
>
>--
>Alexey Parshin,
>http://www.sptk.net
>
>
>
--
Ilya A. Volynets-Evenbakh
Total Knowledge. CTO
http://www.total-knowledge.com