Тъй като другите отговори не споменават какво да направя по въпроса, ще го предоставя тук. Трябва да запазите и възстановите буфера, който 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
унищожи своя буфер, се случва правилното нещо.
За просто пренасочване на стандартен io обикновено средата вече има способността да направи това вместо вас (напр. io пренасочване в обвивката). Вместо горния код вероятно просто бих стартирал програмата като:
yourprogram > oops.log
Също така едно нещо, което трябва да запомните е, че std::cout
е глобална променлива със същите недостатъци като другите глобални променливи. Вместо да го модифицирате или дори да го използвате, може да предпочетете да използвате обичайните техники, за да избегнете всички глобални променливи. Например можете да предадете параметър std::ostream &log_output
и да го използвате, вместо да използвате кода директно cout
.
person
bames53
schedule
13.02.2013