Я должен расширить класс ofstream, чтобы написать сервис потоковой регистрации.
Цель состоит в том, чтобы перехватить каждую строку, добавив в начало каждой строки настроенный текст (дата / время, серьезность и т. Д.).
Теперь ясно, что я не гуру C ++, поэтому я прочитал много документации об этой задаче, например,
http://www.angelikalanger.com/Articles/Topics.html#CPP
http://asmodehn.wordpress.com/2010/06/20/busy-c-coding-and-testing
http://gabisoft.free.fr/articles-en.html
Вышеупомянутые статьи предлагают написать собственный буфер потока, но при портировании этой концепции на файловые потоки я столкнулся с множеством трудностей.
Есть ли более простой метод для достижения этой цели?
Вам не нужно писать собственный буфер потока; самый простой и простой способ — создать класс, в который вы можете отправлять выходные данные, задав ему шаблонизированный оператор с одним аргументом<<():
template <typename T>
std::ostream& operator<<(const T& data_)
{
m_outstream << m_severity << "\t" << getTimeStamp() << "\t" << data_;
return m_outstream;
}
Где m_outstream — это некоторый тип std :: ostream (std :: ofstream и т. Д.). m_severity и getTimeStamp () являются примерами того, что вы можете вставить (и вы можете создать стандартный болотный оператор с двумя аргументами)<<() для форматирования и вывода типа серьезности в ostream).
Это позволяет вам делать такие вещи, как:
myLogger << "failingFunction(" << argument <<
"): Could not do something." << std::endl;
и вы получите вывод m_outstream, который выглядит так:
ПРЕДУПРЕЖДЕНИЕ 2012-01-03 19:32 failingFunction («значение аргумента»): не удалось что-то сделать.
Помимо этого, вам понадобится способ установить серьезность, который может быть таким же простым, как метод, вызываемый в классе регистратора, в который вы добавили оператор templatized<<() до. Если вы хотите стать по-настоящему модным, вы можете написать свой собственный манипулятор, который будет работать так же, как setw (), в std :: ostream. Увидеть http://www.math.hkbu.edu.hk/parallel/pgi/doc/pgC++_lib/stdlibug/man_6665.htm для начинающих на написание манипуляторов.
Других решений пока нет …