Je cherche un moyen de branche (tee) l'entrée lue d'un istream (cin, dans mon cas) sur un fichier journal (sabot/ofstream/etc), tout en utilisant l'entrée pour le traitement.Tee-ing entrée (cin) sur un fichier journal (ou sabot)
J'ai lu à propos de boost :: tee_device, et il est très similaire à mes exigences. Malheureusement, il est implémenté comme un ostream, et résout ainsi un problème similaire de "l'autre côté de la pipe".
J'ai essayé d'écrire une classe istream (adaptateur) qui transmet les fonctions d'entrée à un flux d'entrée enveloppé (cin), et envoie également ce qui a été lu dans le fichier journal. Cela fonctionne très bien pour les types de base qui appellent l'opérateur >> (...) directement, cependant, j'ai rencontré des problèmes avec une utilisation plus avancée du flux d'entrée, par exemple, pour l'opérateur >> (std :: chaîne), et la fonction std :: string getline.
Existe-t-il un moyen plus simple de le faire (éventuellement via la manipulation de rdbuf())?
Merci! Editer: Je pourrais changer mon code partout dans quelque chose comme: Cin >> valeur; boucher < < valeur; - mais ce serait un changement important et laid. Je préférerais aussi avoir un moyen facile de désactiver la journalisation. Ainsi, je voudrais un moyen de modéliser cela en tant que "filtre" istream, puis de simplement remplacer toutes les références à cin avec cet istream "logger".
solution idéale:
class log_istream : public std::istream
{
public:
log_istream(std::istream & in , std::ostream & out);
/* ... istream forwarding functions ... */
private:
std::istream & in_;
std::ostream & out_;
};
int main() {
log_istream logger(std::cin , std::ofstream("logfile.out"));
logger >> value; // this implies infile >> value and logfile << value
getline(logger,my_string); // this also implies logfile.writeline(value)
// etc
}
etc.
J'ai essayé de faire ce que vous avez écrit dans votre message ci-dessus à un moment donné, et cela a fonctionné jusqu'à ce que des caractères spéciaux aient été atteints (comme endl), puis la classe a cessé de fonctionner comme prévu. J'ai hâte de voir les réponses ici. –
Seraient-ils aider: [http://stackoverflow.com/questions/999120/c-hello-world-boost-tee-example-program](http://stackoverflow.com/questions/999120/c-hello-world -boost-tee-example-program) [http://stackoverflow.com/questions/670465/using-boostiostreamsteedevice](http://stackoverflow.com/questions/670465/using-boostiostreamsteedevice) – stefanB