Question

Encore une fois, mon professeur n'a pas été en mesure de répondre à ma question. Je savais qui pourrait peut-être ...

Ainsi, je n’ai jamais vraiment appris le langage C. En C ++, j’utiliserais évidemment une instruction cout tout le temps. Récemment, mon professeur nous a dit de veiller à mettre

setbuf( stdout , NULL );

en haut de main () afin d'obtenir une sortie non tamponnée, nous permettant ainsi de voir la sortie correctement.

Ma question est la suivante: cette déclaration affectera-t-elle une déclaration cout ou simplement une déclaration printf () que j'appelle?

Merci d'avance!

Était-ce utile?

La solution

Par défaut, iostreams et stdio sont synchronisés. Référence.

Cela ne veut pas dire que régler manuellement la mise en tampon stdio est une bonne idée! Vous pouvez utiliser std::endl ou std::flush (à partir de <ostream>) pour vous aider. par exemple,

std::cout << "Hello, world!" << std::endl;

ou

std::cout << "Hello, world!\n" << std::flush;

Les deux font la même chose. ( <=> = imprimer la ligne de fond, puis vider.)

Autres conseils

Par défaut, si stdout ou cout est imprimé sur une console, la sortie est mise en mémoire tampon. Cela signifie que chaque nouvelle ligne imprimée videra la sortie. Vous pouvez appeler explicitement flush () à chaque fois que vous souhaitez modifier le comportement, au cas par exemple, la sortie sera redirigée vers un fichier et que vous souhaitez utiliser tail -f et nécessiter certaines sorties en temps réel.

Comme Chris l'a dit, la sync_with_stdio doit lier la sortie sans tampon à une cout non tamponné (par défaut), mais si vous utilisez uniquement cout, au lieu d'utiliser setbuf sur stdout, une meilleure option consiste à utiliser pubsetbuf sur le pointeur renvoyé par rdbuf . c'est-à-dire:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

Une autre fonction qui peut être intéressante à regarder est la tie .

Habituellement, lorsqu'il est important de voir immédiatement la sortie, nous parlons d'une routine financière complexe et extrêmement fiable qui doit consigner une transaction sur le disque dur avant de l'envoyer à une contrepartie. Ou bien (cas beaucoup plus courant), nous voulons voir les messages de débogage même lorsque le programme plante.

Puisque vous étudiez, je suppose que vous avez affaire au deuxième cas. Dans ce cas, mon conseil serait d'utiliser stderr plutôt que stdout. Il n'est pas mis en mémoire tampon par défaut et vous pouvez le rediriger séparément de stdout, en plaçant votre sortie à un endroit et en vous connectant à un autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top