La ligne stdout est-elle mise en mémoire tampon, non tamponnée ou indéterminée par défaut?
Section 7.9.13/7
de c99
stipule que:
Au démarrage du programme, texte trois flux sont prédéfinis et ne doivent pas être ouverts de manière explicite - l'entrée standard (pour la lecture des classiques d'entrée), la sortie standard (pour l'écriture conventionnelle de sortie), et l'erreur-type (pour l'écriture de sortie de diagnostic).
Comme initialement ouvert, le flux d'erreur standard n'est pas entièrement mis en mémoire tampon; l'entrée standard et la sortie standard, les flux sont entièrement mis en mémoire tampon si et seulement si le cours d'eau peut être déterminée à ne pas se référer à un dispositif interactif.
Ce qui fait du sens. Si vous êtes à la poussée de la sortie standard vers un fichier, vous le voulez avec tampon pour plus d'efficacité.
Mais je ne peux trouver aucune mention dans la norme si la sortie est de la ligne de mise en mémoire tampon ou sans tampon lorsque vous ne peut pas de déterminer le périphérique est non-interactif (c'est à dire, de la production normale d'un terminal).
La raison, j'ai été demander à un commentaire de ma réponse ici que je dois insérer un fflush(stdout);
entre les deux états:
printf ("Enter number> ");
//fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
parce que je n'étais pas la résiliation de la printf
avec un saut de ligne. Quelqu'un peut-il éclaircir ce point?
source d'informationauteur paxdiablo | 2010-09-16
Vous devez vous connecter pour publier un commentaire.
Le standard C99 ne précise pas si les trois flux standard sont des barrettes de mémoire ou de la ligne de tampon: C'est à la mise en œuvre. Toutes les implémentations UNIX que je connais ont une ligne de tampon
stdin
. Sur Linux,stdout
en ligne de tampon etstderr
sans tampon.Autant que je sache, POSIX n'est pas d'imposer des restrictions supplémentaires. POSIX est fflush page ne se remarque dans les EXEMPLES de la section:
Donc la remarque que vous ajoutez
fflush(stdout);
est correct.Une autre solution pourrait être de faire
stdout
sans tampon:Mais comme R. notes vous pouvez seulement le faire une fois, et il faut le faire avant de vous écrire pour
stdout
ou d'effectuer toute autre operantion sur elle. (C99 7.19.5.5 2)Je viens de lire un récente fil sur
comp.lang.c
à propos de la même chose. Une des remarques: