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

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

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

Благодарю.

-William

1 ответ

Решение

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

Общий пример написания пользовательского 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 для управления переключением буфера.

Другие вопросы по тегам