Здравствуйте Павел Кузнецов, Вы писали:
ПК>Здравствуйте 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 нереально.