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

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

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

Спасибо.

-William

1 Ответ

2 голосов
/ 15 июня 2009

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

...