Как переопределить rdbuf() clog, чтобы он был тройником оригинального rdbuf() clog и файла журнала?

Есть ли у кого-нибудь пример того, как переопределить C++, встроенный в clog, чтобы вместо этого иметь новый связанный rdbuf(), который обрабатывается как тройник для исходного clog.rdbuf() и rdbuf() объекта ofstream для журнала файл на диске.

Намерение состоит в том, чтобы код использовал std::clog повсюду, но чтобы он переходил как к месту назначения clog по умолчанию, так и к файлу журнала на диске.

Спасибо.

-Уильям


person WilliamKF    schedule 02.06.2009    source источник
comment
НЕ задавайте один и тот же вопрос дважды: stackoverflow.com/questions/937805/   -  person lothar    schedule 03.06.2009


Ответы (1)


Вам нужно будет написать собственный класс, производный от streambuf. Пусть он выдаст данные как в rdbuf вашего ofstream, так и в исходный rdbuf clog.

Общий пример написания пользовательского streambuf:

http://www.dreamincode.net/code/snippet2499.htm

Сохранение нового буфера потока может быть выполнено следующим образом:

// grab buffer for clog
std::streambuf* oldClogBuf = std::clog.rdbuf();

// create custom buffer which feeds both clog and an ofstream
CustomBuffer* customBuf = new CustomBuffer( oldClogBuf );

// stash custom buffer
std::clog.rdbuf( customBuf );

...do stuff...

// restore original clog buffer
std::clog.rdbuf( oldClogBuf );

Вы можете сделать все это более надежным, используя идиому RAII для управления переключением буфера.

person nsanders    schedule 14.06.2009