web-dev-qa-db-fra.com

stdout et besoin de le vider C++

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?

17
Dixon Steel

Pour ajouter aux autres réponses: vos instructions de débogage doivent plutôt aller à cerr, car:

  • il écrit sur l'erreur standard, ce qui signifie que, en exécutant l'application, vous pouvez facilement séparer la sortie du programme "normal" des informations d'erreur/de débogage via une redirection;
  • le plus important, 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)

11
Matteo Italia

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.

9
James Kanze

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.

4
mah

"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

1

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.

0

En C++, vous pouvez utiliser le formateur endl avec l'opérateur cout plutôt que flush.

0
Stuti

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.

0
mike