2012-06-13 2 views
4

Bonne journée,automatique Cout rinçage

J'ai écrit un programme Java qui démarre plusieurs programmes écrits en C++ en utilisant l'objet de processus et appels de fonction Runtime.exec(). Les programmes C++ utilisent cout et cin pour leur entrée et leur sortie. Le programme Java envoie des informations et lit des informations à partir du flux d'entrée des programmes C++ et du flux de sortie. J'ai alors un tampon de chaîne qui construit ce à quoi ressemblerait une interaction typique du programme en ajoutant au tampon de chaîne l'entrée et la sortie du programme C++. Le problème est que tous les appels d'entrée sont ajoutés et tous les appels de sortie sont affichés. Par exemple, et par exemple de la StringBuffer peut-être quelque chose comme ça ...

2 
3 
Please enter two numbers to add. Your result is 5 

lorsque le programme ressemblerait à ceci sur une console standard

Please enter two numbers to add. 2 
3 
Your result is 5 

Le problème est que je reçois l'ordre de l'entrée et de la sortie toutes en wack car à moins que le programme C++ n'appelle la fonction cout.flush(), la sortie ne soit pas écrite avant que l'entrée ne soit donnée.

Existe-t-il un moyen de vider automatiquement le tampon pour que le programme C++ n'ait pas à s'inquiéter de l'appel de cout.flush()? Similaire à comme si le programme C++ était un programme autonome interagissant avec la console de commande, le programmeur n'a pas toujours besoin du cout.flush(), la console de commande sort toujours les données avant l'entrée.

Merci,

+2

S'il s'agit d'un programme interactif, il est bon de le vider manuellement de toute façon. 'std :: cout <<" S'il vous plaît entrer deux nombres à ajouter. "<< std :: flush' – cdhowie

+0

Si le Java envoie les données, je ne pense pas que cela soit théoriquement résoluble dans le cas général, notez que vous pouvez faire la même chose à partir d'un fichier batch: 'echo 2 & echo 3 & myprogram.exe <<<" 2 \ n3' et il semblerait tout de même.Le problème ici n'a rien à voir avec le rinçage ou le tamponnage. –

Répondre

2

Je ne peux pas garantir qu'il résoudra tous vos problèmes, mais pour rincer automatiquement le flux lorsque vous êtes cout ing vous pouvez utiliser endl

par exemple:

cout << "Please enter two numbers to add: " << endl;

utilisant "\n" ne pas rincer le flux, comme si vous faisiez:

cout << "Please enter two numbers to add:\n";

Gardez à l'esprit que l'utilisation endl peut être (relativement) lent si vous faites beaucoup de sortie

Voir this question pour plus d'infos

+1

Pages SO connexes: http://stackoverflow.com/questions/213907/c-stdendl-vs-n – kol

2

au cas où quelqu'un vient chercher un moyen de réglez cout pour toujours rincer. Ce qui peut être tout à fait juste en faisant une enquête Coredump ou similaire.

Jetez un oeil à std::unitbuf.

std::cout << std::unitbuf; 

Au début du programme.

Il va vider à chaque insertion par défaut.