Ponieważ inne odpowiedzi nie zawierają wzmianki o tym, co należy zrobić, podam to tutaj. Musisz zapisać i przywrócić bufor, którym ma zarządzać cout. Na przykład:
#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;
}
Teraz gdy bufor cout
„s otrzymuje przed cout
ulega zniszczeniu pod koniec programu, więc kiedy cout
niszczy buforze poprawna rzecz dzieje.
Dla zwykłego przekierowania standardowego io ogólnie środowisko ma już taką możliwość (np. Przekierowanie io w powłoce). Zamiast powyższego kodu I pewnie po prostu uruchomić program jako:
yourprogram > oops.log
Również jeden rzeczą do zapamiętania jest to, że std::cout
jest zmienna globalna z wszystkich tych samych wad jak inne zmienne globalne. Zamiast modyfikować lub nawet używać go, możesz użyć standardowych technik, aby uniknąć zmiennych globalnych. Na przykład możesz przekazać parametr std::ostream &log_output
i użyć go zamiast używać kodu bezpośrednio pod numerem cout
.
Powinieneś rozwinąć więcej na swoim tytule. – 0x499602D2