Re[2]: Перегрузка streambuf
От: Sv2k  
Дата: 30.08.02 16:06
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>Здравствуйте paul_shmakov, Вы писали:


PS>>Как можно перегрузить streambuf для ofstream для модификации содержимого буфера при фактической записи содержимого в файл? В первую очередь интересует подпечатывание даты в начале новой строки, т.е. после выполнения операции:


PS>> s << "Some string\n" << "Another string\n" << flush;


PS>>В файле должно оказаться такое содержимое:


PS>>[Дата] Some string

PS>>[Дата] Another string

ПК>Надо унаследовать свой класс, скажем LogBuf (), от std::streambuf и подменить его метод overflow,


ПК>Кроме того, для полнофункциональной работы твоего буфера надо будет переопределить функции underflow (если буфер предназначен для работы в режиме чтения), seekoff, seekpos (если хочешь, чтобы поток, проинициализированный твоим буфером поддерживал seek), sync и т.д., согласно документации.


ПК>Теперь осталось подменить потоку его буфер на твой. Если тебе не надо, чтобы поток был именно std::ofstream, просто передавай в конструктор std::ostream свой буфер, в противном случае надо будет вызывать std::ostream::rdbuf, передавая в качестве аргумента свой LogBuf.


Первоначальное сообщение написал я, просто лень регистрироваться было. Буду разбираться, похоже на выход.

К сожалению, придется переползать на GCC 3.2 (и потерять совместимость с GCC 2.95), так как в старой библиотеке libstdc++ класс ofstream наследуется от fstreambase, в котором есть такие гадости:

class fstreambase : virtual public ios {
    mutable filebuf __my_fb;

public:
    filebuf* rdbuf() const { return &__my_fb; }
    . . .
}


Соответственно, вызывать std::ostream::rdbuf, передавая в качестве аргумента свой LogBuf нереально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.