C ++ stdout duplicado para arquivo redirecionando cout

Dia bom.

Eu tenho que usar algumas funções externas que produzem muita informação de debugging para stdout (via std::cout ). Eu quero duplicar esta informação para algum arquivo de log, redirecionando cout para aumentar tee_device . Eu uso o seguinte código de exemplo:

 typedef boost::iostreams::tee_device TeeDevice; typedef boost::iostreams::stream TeeStream; int main(int argc, char** argv) { remove("file.log"); ofstream logFile; logFile.open("file.log"); TeeDevice outputDevice(cout, logFile); TeeStream logger(outputDevice); cout.rdbuf(logger.rdbuf()); cout << "some log info";//this should print both to stdout and to file logger.close(); } 

No entanto, tenho uma falha de segmentação ao tentar executar isso. Por quê?

Eu sei que posso fazer como

  logger << "some debug log info"; 

mas preciso exatamente redirect o cout . Como eu posso conseguir isso?

Obrigado Stanislav

Você configura a saída TeeDevice para std::cout , e então substitui o seu rdbuf por um que depende do TeeDevice (que depende do std::cout ).

O problema é resolvido quebrando esse ciclo via std::ostream temporário que contém o ponteiro para o rdbuf original de std::cout :

 int main() { remove("file.log"); ofstream logFile; logFile.open("file.log"); ostream tmp(cout.rdbuf()); // <---- TeeDevice outputDevice(tmp, logFile); // <---- TeeStream logger(outputDevice); cout.rdbuf(logger.rdbuf()); cout << "some log info" << endl; logger.close(); } 

Demo ao vivo em Coliru

Tente usar a function freopen . Aqui está um exemplo e comentário do cplusplus.com :

Esta function é especialmente útil para redirect streams predefinidos como stdin, stdout e stderr para arquivos específicos (veja o exemplo abaixo).

 /* freopen example: redirecting stdout */ #include  int main () { freopen ("myfile.txt","w",stdout); printf ("This sentence is redirected to a file."); fclose (stdout); return 0; }