Si vous voulez simplement envoyer du texte à un fichier plutôt qu'à la console, alors std::ofstream
est votre ami. Comme cout
, votre instance de ofstream
partage le comportement de ostream
qui a déjà un <<
operator
approprié pour les chaînes et peut être utilisé exactement comme cout
. Voici un exemple:
#include <fstream>
int main()
{
std::ofstream fout("somefile.txt");
fout << "Some text" << std::endl;
return EXIT_SUCCESS;
}
compiler et exécuter et vous verrez que vous avez un nouveau fichier dans le répertoire de travail courant:
% cat somefile.txt
Some text
Si vous avez besoin de diffuser un objet qui doesn « t ont operator <<
surchargé pour std::ostream
, alors vous vous devez surcharger l'opérateur, comme ceci:
std::ostream& operator <<(std::ostream& os, const SomeClass& instance)
{
instance.print(os);
return os;
}
Vous aurez besoin de void SomeClass::print(std::ostream& os)
défini pour envoyer ses données privées à os
(cela vous évite de créer le <<
un friend
de votre classe).
Avez-vous parlé à propos purement cout
, alors ce n'est pas « surcharge d'opérateur », c'est la redirection de flux. Mais, oui, il est possible (aussi) en définissant le tampon de flux associé en utilisant std::basic_ios::rdbuf()
.
est ici my solution de "Redirecting in C++":
#include <iostream>
#include <fstream>
class scoped_cout_redirector
{
public:
scoped_cout_redirector(const std::string& filename)
:backup_(std::cout.rdbuf())
,filestr_(filename.c_str())
,sbuf_(filestr_.rdbuf())
{
std::cout.rdbuf(sbuf_);
}
~scoped_cout_redirector()
{
std::cout.rdbuf(backup_);
}
private:
scoped_cout_redirector();
scoped_cout_redirector(const scoped_cout_redirector& copy);
scoped_cout_redirector& operator =(const scoped_cout_redirector& assign);
std::streambuf* backup_;
std::ofstream filestr_;
std::streambuf* sbuf_;
};
int main()
{
{
scoped_cout_redirector file1("file1.txt");
std::cout << "This is written to the first file." << std::endl;
}
std::cout << "This is written to stdout." << std::endl;
{
scoped_cout_redirector file2("file2.txt");
std::cout << "This is written to the second file." << std::endl;
}
return 0;
}
http://www.cplusplus.com/reference/iostream/fstream/open/ – SingleNegationElimination
Pour les petits programmes (outils), il est en fait pas une mauvaise chose juste écrire à cout et diriger vers un fichier lors de l'exécution du programme (mytool> output.txt) – stefaanv