2011-04-15 2 views
6

Je souhaite que mon programme imprime quelque chose, attendez quelques secondes, puis imprimez autre chose sur la même ligne. J'ai essayé de l'écrire comme:Impression sur la même ligne d'une pause en C

printf ("bla bla bla"); 
sleep (2); 
printf ("yada yada yada\n"); 

mais dans la sortie que je reçois attendre pendant 2 secondes puis-je obtenir toute la ligne imprimée comme l'un. Quand j'ai essayé de mettre la sortie dans différentes lignes, elle a imprimé avec une pause.

Comment est-ce que je fais pour imprimer avec une pause dans la même ligne?

* Travailler sur Linux

+4

fflush (stdout); – Erik

+0

Selon votre besoin, 'fflush' ne peut être que le début du problème. Voir [ma réponse] (http://superuser.com/q/239893/1711) à une question depuis déplacé à SuperUser pour un exemple de travail modérément complet. – dmckee

Répondre

17
printf ("bla bla bla"); 
fflush(stdout); 
sleep (2); 
printf ("yada yada yada\n"); 

fflush force le stdout tampon interne devant être vidées à l'écran.

3

Le stdout est un flux de ligne tamponné par défaut, ce qui signifie que vous devez le vider explicitement. Il est implicitement vidé sur newline. Ce comportement est mandaté par la norme C99.

Cela signifie que dans votre premier printf, le texte est ajouté à un tampon interne. Ceci est fait pour améliorer l'efficacité, par ex. lors de l'impression de beaucoup de petits fragments de texte.

Votre deuxième printf contient un saut de ligne, ce qui provoque le vidage du flux. Vous pouvez explicitement vider stdout via fflush(stdout); si vous le souhaitez. Comme alternative, vous pouvez également utiliser le stderr unbuffered, comme dans fprintf(stderr, "bla bla bla");, mais comme son nom l'indique, il est destiné à des erreurs et des avertissements.

Voir aussi la question SO Why does printf not flush after the call unless a newline is in the format string?.