Я ищу способ ветвления (т. Е.) Ввода, считанного из istream (cin, в моем случае), в файл журнала (clog / ofstream / etc), при этом все еще используя вход для обработки.
Я читал о boost :: tee_device, и он очень похож на мои требования. К сожалению, он реализован как ostream и, таким образом, решает аналогичную проблему с «другой стороны трубы».
Я попытался написать класс istream (адаптер), который перенаправляет входные функции в упакованный поток ввода (cin), а также отправляет то, что было прочитано, в файл журнала.
Это прекрасно работает для базовых типов, которые вызывают оператор >> (...) напрямую, однако у меня возникли проблемы с более сложным использованием входного потока, например, для оператора >> (std :: string ) и функция getline std :: string.
Есть ли более простой способ сделать это (возможно, с помощью манипуляции с rdbuf ())?
Спасибо!
Редактировать: я мог бы повсеместно изменить свой код на что-то вроде: cin >> value; засорение << значение; - но это было бы значительным и безобразным изменением. Я также предпочел бы иметь простой способ отключить регистрацию. Таким образом, я хотел бы получить способ смоделировать это как «фильтр» istream, а затем просто заменить все ссылки на cin этим «логгером» istream. </p>
Идеальное решение:
class log_istream : public std::istream
{
public:
log_istream( std::istream & in , std::ostream & out );
/* ... istream forwarding functions ... */
private:
std::istream & in_;
std::ostream & out_;
};
int main() {
log_istream logger( std::cin , std::ofstream("logfile.out") );
logger >> value; // this implies infile >> value and logfile << value
getline(logger,my_string); // this also implies logfile.writeline(value)
// etc
}
и т.д.