Affectation de cout à un nom de variable
Dans la norme ANSI C++, comment puis-je affecter le flux de cout à un nom de variable? Ce que je veux faire, c'est que si l'utilisateur a spécifié un nom de fichier de sortie, j'envoie sortie de là, sinon, l'envoyer à l'écran. Donc quelque chose comme:
ofstream outFile;
if (outFileRequested)
outFile.open("foo.txt", ios::out);
else
outFile = cout; //Will not compile because outFile does not have an
//assignment operator
outFile << "whatever" << endl;
J'ai essayé de faire cela comme une Macro-fonction:
#define OUTPUT outFileRequested?outFile:cout
OUTPUT << "whatever" << endl;
Mais cela m'a donné une erreur du compilateur.
Je suppose que je pourrais utiliser un if-then bloc pour chaque sortie, mais je voudrais éviter que si je le pouvais. Des idées?
source d'informationauteur user12576 | 2009-01-09
Vous devez vous connecter pour publier un commentaire.
Utiliser une référence. Notez que la référence doit être de type
std::ostream
passtd::ofstream
depuisstd::cout
est unstd::ostream
de sorte que vous devez utiliser le plus petit dénominateur commun.Je suppose que votre programme se comporte comme standard des outils unix, que lorsqu'il n'est pas donné d'un fichier en écriture sur la sortie standard, et si un fichier d'écrire dans ce fichier. Vous pouvez rediriger
cout
d'écrire dans une autre mémoire tampon du flux. Tant que votre redirection est vivant, tout ce qui est écrit à cout est écrit de manière transparente à la destination que vous avez désigné. Une fois la redirection de l'objet est hors de portée, le flux d'origine est mise et sortie d'écrire à nouveau l'écran:Maintenant, le cout est redirigé vers le fichier tant que le tuyau est en vie en main. Vous pouvez la rendre plus "prêt pour la production" et en fait non copiable, parce qu'il n'est pas prêt à être copié: Si la copie est hors de portée, il serait de rétablir le flux d'origine déjà.
Vous pouvez trouver une explication détaillée de comment faire ici:
http://groups.google.com/group/comp.lang.c++/msg/1d941c0f26ea0d81?pli=1
J'espère que quelqu'un va écrire ça plus clairement pour dépassement de pile de prendre les points...
Suivantes Adam Rosenfield's des pistes, mais la fixation de la référence de l'initialisation de problème avec ternaire et la virgule opérateurs:
(Testé dans VS)
Je pense que Adam est sur la bonne piste, mais je ne pense pas que vous pouvez attribuer des références - vous besoin d'utiliser un pointeur à la place:
vous pouvez ensuite définir une référence à la valeur du pointeur, mais il ne serait pas global
Je ne suis pas sûr que vous pouvez attribuer le cout d'une variable de type ofstream. cout est un objet de type ostream (alors que cin est de type istream) et je ne suis pas sûr que l'on hérite de l'autre. Alors, peut-être quelque chose de la vérification pour voir si un fichier a été donné/existe et la création de la catégorie appropriée type serait une meilleure approche.
Cela a pris environ deux heures pour arriver. En gros, j'ai une classe externe et l'exécution d'une suite de tests. - Je envoyer un délégué pour exécuter les tests, afin d'avoir accès à la sortie j'ai besoin d'envoyer un flux de sortie. Je suppose que j'aurais pu faire un autre flux par test. De toute façon, je voulais passer dans le ofstream pour être utilisé plus tard.