J'ai du code C++ qui utilise des instructions cout
à des fins de débogage et pour une raison quelconque, je ne peux pas imprimer toutes les données à moins que je ne fasse un std::cout.flush();
à la fin.
Je ne comprends pas très bien pourquoi cette opération de vidage est nécessaire.
Quelqu'un at-il un aperçu?
Pour ajouter aux autres réponses: vos instructions de débogage doivent plutôt aller à cerr
, car:
cerr
par défaut est unbuffered , ce qui signifie qu'après chaque opération de sortie, il se videra automatiquement, ce qui est généralement souhaitable pour les erreurs et la sortie de débogage.(source: norme C++, §27.3.1 §4-5, §27.4.2.1.2 tableau 83)
Utilisez-vous std::endl
pour mettre fin à vos lignes? Cela devrait être la pratique habituelle de , Jusqu'à ce que des problèmes de performances l'exigent, mais pour une raison quelconque , Je vois beaucoup de code qui utilise plutôt '\n'
.
Sinon, vous pouvez toujours faire:
std::cout.setf( std::ios_base::unitbuf );
comme l'une des premières choses dans main
. Cela entraînera un vidage à la fin du De chaque <<
, ce qui est plus que nécessaire, mais pour le diagnostic Transmis à la console, est probablement tout à fait acceptable.
Les données qui ne sont pas automatiquement vidées manquent-elles d'un \n
à la fin? Par défaut, la sortie standard n'est pas livrée tant qu'un retour de chariot n'est pas vu.
"Lorsque vous envoyez une sortie vers un flux, celle-ci n'est pas nécessairement imprimée immédiatement. Au contraire, elle peut attendre dans un tampon jusqu'à ce qu'un événement non spécifié, par exemple un tampon suffisamment plein, une lecture d'entrée ou une sortie du programme. Les détails peuvent varier."
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
C'est le bon comportement. Vous utilisez probablement std::endl
qui ajoute \n
et videz le tampon. http://www.cplusplus.com/reference/ostream/endl/
Vous devez vider le flux si vous voulez voir la sortie.
En C++, vous pouvez utiliser le formateur endl
avec l'opérateur cout
plutôt que flush
.
La réponse de std::endl
n'est valide que si vous souhaitez un retour. Vous ne savez pas exactement comment procéder si vous souhaitez supprimer une invite de commande.