2009-06-02 9 views
1

Est-ce que quelqu'un a un exemple de comment redéfinir le C++ construit en sabot à la place a un nouveau rdbuf() associé qui est traité pour être un tee à l'original clog.rdbuf() et le rdbuf() d'un objet ofstream à un fichier journal sur le disque.Comment redéfinir rdbuf() de clog pour être un té à l'original rdbuf() de clog et celui d'un fichier journal?

L'intention est de faire en sorte que le code utilise std :: clog tout au long, mais de le faire passer à la fois à la destination par défaut du sabotage ainsi qu'à un fichier journal sur le disque.

Merci.

-William

+0

Veuillez ne PAS poser deux fois la même question: http://stackoverflow.com/questions/937805/how-to-redefine-clog-to-tee-to-original-clog-and-a-log-file – lothar

Répondre

2

Vous devrez écrire un streambuf personnalisée classe dérivée. Avoir craché des données à la fois rdbuf de votre ofstream et votre rogb rdbuf d'origine.

Un exemple général d'écrire un streambuf personnalisé:

http://www.dreamincode.net/code/snippet2499.htm

Stashing le nouveau tampon de flux peut se faire comme suit:

// grab buffer for clog 
std::streambuf* oldClogBuf = std::clog.rdbuf(); 

// create custom buffer which feeds both clog and an ofstream 
CustomBuffer* customBuf = new CustomBuffer(oldClogBuf); 

// stash custom buffer 
std::clog.rdbuf(customBuf); 

...do stuff... 

// restore original clog buffer 
std::clog.rdbuf(oldClogBuf); 

Vous pouvez rendre plus robuste toute la chose en utilisant l'idiome RAII pour gérer la commutation du tampon.