Je cherchais une solution pour écrire dans un fichier et dans la console en même temps. J'ai trouvé une solution intéressante aquí .
Comme je travaille en pré C++11, j'ai dû faire un petit changement au code de Lightness Races in Orbit :
#include <iostream>
#include <fstream>
#include <string>
struct OutputAndConsole : std::ofstream
{
OutputAndConsole(const std::string& fileName)
: std::ofstream(fileName.c_str()) // constructor taking a string is C++11
, fileName(fileName)
{};
const std::string fileName;
};
template <typename T>
OutputAndConsole& operator<<(OutputAndConsole& strm, const T& var)
{
std::cout << var;
static_cast<std::ofstream&>(strm) << var;
return strm;
};
Il fonctionne bien à l'exception d'une petite chose qui me laisse perplexe. Si je l'utilise comme ça :
int main(){
OutputAndConsole oac("testLog.dat");
double x = 5.0;
oac << std::endl;
static_cast<OutputAndConsole&>(oac << "foo \n" << x << "foo").operator<<(std::endl);
oac << "foo" << std::endl;
}
alors tous les std::endl
sont ignorés pour la sortie sur la console alors qu'ils apparaissent correctement dans le fichier. Je pense que lorsque j'utilise std::endl
le site ostream::operator<<
est appelé, ce qui permet d'imprimer dans le fichier mais pas dans la console. La ligne avec le static_cast<OutputAndConsole&>
est ma tentative dilettante d'appeler l'opérateur correct, mais toujours seulement le saut de ligne de \n
apparaît sur la console.
Pourquoi pour std::endl
le mauvais opérateur est appelé ?
Comment puis-je appeler la bonne personne ?
PS : Je sais que je peux utiliser \n
sans problème, mais j'aimerais quand même savoir ce qui se passe ici et comment le réparer.