создание своего потоковго вывода
От: CyberZX  
Дата: 09.02.05 12:23
Оценка:
У меня тут возникла задача сделать вывод в лог на основе стандартного потокового вывода. Пусть, например, у меня есть фукнция 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 >>
Re: создание своего потоковго вывода
От: MaximE Великобритания  
Дата: 09.02.05 13:16
Оценка:
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 Spencer
Posted via RSDN NNTP Server 1.9
Re: создание своего потоковго вывода
От: Glorg, Twinhead Россия  
Дата: 09.02.05 15:06
Оценка:
вот пример. Всё выводит, через overflow
http://paste.netimperia.com/results/ccfkc7mg65.html
Re[2]: создание своего потоковго вывода
От: MaximE Великобритания  
Дата: 09.02.05 15:32
Оценка:
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 Spencer
Posted via RSDN NNTP Server 1.9
Re[3]: создание своего потоковго вывода
От: CyberZX  
Дата: 09.02.05 16:14
Оценка:
Здравствуйте, 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 >>
Re[4]: создание своего потоковго вывода
От: MaximE Великобритания  
Дата: 09.02.05 16:42
Оценка:
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 Spencer
Posted via RSDN NNTP Server 1.9
Re[3]: создание своего потоковго вывода
От: Glorg, Twinhead Россия  
Дата: 09.02.05 17:00
Оценка:
>> http://paste.netimperia.com/results/ccfkc7mg65.html
ME>Без перегрузки sync() не со всеми стандартными библиотеками это будет работать.
Обновлённая версия, которая больше похожа на правду. Надеюсь
Немного неверно pbump() стоит.
http://paste.netimperia.com/results/z2lwrq33r5.html
Re[4]: создание своего потоковго вывода
От: MaximE Великобритания  
Дата: 09.02.05 17:31
Оценка:
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 Spencer
Posted via RSDN NNTP Server 1.9
Re[4]: создание своего потоковго вывода
От: MaximE Великобритания  
Дата: 09.02.05 17:38
Оценка:
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 Spencer
Posted via RSDN NNTP Server 1.9
Re: создание своего потоковго вывода
От: Кодт Россия  
Дата: 09.02.05 21:47
Оценка:
Здравствуйте, CyberZX, Вы писали:

CZX>У меня тут возникла задача сделать вывод в лог на основе стандартного потокового вывода. Пусть, например, у меня есть фукнция Debug::print(const std::string&);

CZX>И мне нужно создать объект ostream Debug::cout, который будет использывать для вывода эту функцию print. Сейчас я просто создаю свой буфер, который наследует от std::basic_stringbuf, и переопределяю там функцию xsputn.

Посмотри на hello, debug window
Автор: Кодт
Дата: 29.11.03
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.