Поскольку в других ответах не упоминается, что с этим делать, я приведу это здесь. Вам нужно сохранить и восстановить буфер, которым должен управлять cout. Например:
#include <fstream>
#include <iostream>
// RAII method of restoring a buffer
struct buffer_restorer {
std::ios &m_s;
std::streambuf *m_buf;
buffer_restorer(std::ios &s, std::streambuf *buf) : m_s(s), m_buf(buf) {}
~buffer_restorer() { m_s.rdbuf(m_buf); }
};
int main()
{
std::ofstream log("oops.log");
buffer_restorer r(std::cout, std::cout.rdbuf(log.rdbuf()));
std::cout << "Oops!\n";
return 0;
}
Теперь, когда буфер cout
заменяется до того, как cout
будет уничтожен в конце программы, поэтому, когда cout
уничтожает свой буфер, происходит правильное действие.
Для простого перенаправления стандартного ввода-вывода обычно среда уже имеет возможность сделать это за вас (например, перенаправление ввода-вывода в оболочке). Вместо приведенного выше кода я бы, вероятно, просто запустил программу как:
yourprogram > oops.log
Также следует помнить, что std::cout
— это глобальная переменная со всеми теми же недостатками, что и другие глобальные переменные. Вместо того, чтобы изменять или даже использовать его, вы можете предпочесть использовать обычные методы, чтобы избежать глобальных переменных вообще. Например, вы можете передать параметр std::ostream &log_output
и использовать его вместо того, чтобы код использовал cout
напрямую.
person
bames53
schedule
13.02.2013