У меня тут возникла задача сделать вывод в лог на основе стандартного потокового вывода. Пусть, например, у меня есть фукнция Debug::print(const std::string&);
И мне нужно создать объект ostream Debug::cout, который будет использывать для вывода эту функцию print. Сейчас я просто создаю свой буфер, который наследует от std::basic_stringbuf, и переопределяю там функцию xsputn.
То есть делаю вот так:
namespace Debug
{
class debug_streambuf : public std::basic_stringbuf<char, std::char_traits<char> >
{
protected:
typedef std::char_traits<char> _Traits;
virtual int xsputn(const char *_Ptr, int _Count)
{
string str;
str.append(_Ptr, _Count);
print(_Ptr);
return _Count;
}
};
debug_streambuf _Mybuf;
ostream сout(&_Mybuf);
}
Такой метод работает, но не всегда, например у меня не выводятся арифметические переменные, а только строки. Как добиться нужной мне функциональности правильно?
... << RSDN@Home 1.1.3 stable >>
CyberZX wrote:
> У меня тут возникла задача сделать вывод в лог на основе стандартного потокового вывода. Пусть, например, у меня есть фукнция Debug::print(const std::string&);
> И мне нужно создать объект ostream Debug::cout, который будет использывать для вывода эту функцию print. Сейчас я просто создаю свой буфер, который наследует от std::basic_stringbuf, и переопределяю там функцию xsputn.
>
> То есть делаю вот так:
> > namespace Debug
> {
> class debug_streambuf : public std::basic_stringbuf<char, std::char_traits<char> >
> {
> protected:
> typedef std::char_traits<char> _Traits;
>
> virtual int xsputn(const char *_Ptr, int _Count)
> {
> string str;
> str.append(_Ptr, _Count);
> print(_Ptr);
> return _Count;
> }
> };
>
> debug_streambuf _Mybuf;
> ostream сout(&_Mybuf);
> }
>
> Такой метод работает, но не всегда, например у меня не выводятся арифметические переменные, а только строки. Как добиться нужной мне функциональности правильно?
Нужно также переопределить sync() и overflow().
--
Maxim Yegorushkin
Those who do not understand Unix are condemned to reinvent it, poorly. © Henry SpencerPosted via RSDN NNTP Server 1.9
Glorg, Twinhead wrote:
> вот пример. Всё выводит, через overflow
> http://paste.netimperia.com/results/ccfkc7mg65.html
Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
--
Maxim Yegorushkin
Those who do not understand Unix are condemned to reinvent it, poorly. © Henry SpencerPosted via RSDN NNTP Server 1.9
Здравствуйте, MaximE, Вы писали:
ME>Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
кстати, я остановился вот на такой реализации буфера
class debug_streambuf : public std::basic_stringbuf<char, std::char_traits<char> >
{
protected:
virtual int sync()
{
print(str());
return 0;
}
};
вроде то что надо, но найти бы еще способ очищать буфер. а то каждый раз выводится его полное содержимое. или хотя бы получить доступ к последнему добавляемому елементу, я пробывал шаманить с pbase(), pptr(),epptr(), eback(), gptr(),egptr(). но ничего не добился
... << RSDN@Home 1.1.3 stable >>
CyberZX wrote:
[]
> вроде то что надо, но найти бы еще способ очищать буфер. а то каждый раз выводится его полное содержимое. или хотя бы получить доступ к последнему добавляемому елементу, я пробывал шаманить с pbase(), pptr(),epptr(), eback(), gptr(),egptr(). но ничего не добился
Возьми код, который запостил Glorg, Twinhead.
--
Maxim Yegorushkin
Those who do not understand Unix are condemned to reinvent it, poorly. © Henry SpencerPosted via RSDN NNTP Server 1.9
>> http://paste.netimperia.com/results/ccfkc7mg65.html
ME>Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
Обновлённая версия, которая больше похожа на правду. Надеюсь

Немного неверно pbump() стоит.
http://paste.netimperia.com/results/z2lwrq33r5.html
Glorg, Twinhead wrote:
>>> http://paste.netimperia.com/results/ccfkc7mg65.html
> ME>Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
> Обновлённая версия, которая больше похожа на правду. Надеюсь
> Немного неверно pbump() стоит.
> http://paste.netimperia.com/results/z2lwrq33r5.html
Тебе не нужен никакой pbump(). Твой буфер не имеет буфера

Он выводит данные без буферизации прямиком в printf, поэтому pptr() и pbase() должны возвращать 0.
--
Maxim Yegorushkin
Those who do not understand Unix are condemned to reinvent it, poorly. © Henry SpencerPosted via RSDN NNTP Server 1.9
Glorg, Twinhead wrote:
>>> http://paste.netimperia.com/results/ccfkc7mg65.html
> ME>Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
> Обновлённая версия, которая больше похожа на правду. Надеюсь
> Немного неверно pbump() стоит.
> http://paste.netimperia.com/results/z2lwrq33r5.html
см.
http://rsdn.ru/Forum/?mid=942482Автор: MaximE
Дата: 10.12.04
--
Maxim Yegorushkin
Those who do not understand Unix are condemned to reinvent it, poorly. © Henry SpencerPosted via RSDN NNTP Server 1.9
Здравствуйте, CyberZX, Вы писали:
CZX>У меня тут возникла задача сделать вывод в лог на основе стандартного потокового вывода. Пусть, например, у меня есть фукнция Debug::print(const std::string&);
CZX>И мне нужно создать объект ostream Debug::cout, который будет использывать для вывода эту функцию print. Сейчас я просто создаю свой буфер, который наследует от std::basic_stringbuf, и переопределяю там функцию xsputn.
Посмотри на
hello, debug windowАвтор: Кодт
Дата: 29.11.03