Section 7.9.13/7
de c99
stipule que:La ligne stdout est-elle mise en mémoire tampon, non tamponnée ou indéterminée par défaut?
Au démarrage du programme, trois flux de texte sont prédéfinis et ne doivent pas être ouverts explicitement - l'entrée standard (pour la lecture des données), la sortie standard (pour l'écriture sortie conventionnelle) et erreur standard (pour l'écriture de la sortie de diagnostic).
A l'ouverture initiale, le flux d'erreur standard n'est pas entièrement mis en mémoire tampon; les flux d'entrée standard et de sortie standard sont entièrement tamponnés si et seulement si le flux peut être déterminé comme ne faisant pas référence à un périphérique interactif.
Cela a du sens. Si vous placez votre sortie standard dans un fichier, vous voulez qu'elle soit entièrement mise en mémoire tampon pour plus d'efficacité.
Mais je ne trouve aucune mention dans la norme quant à savoir si la sortie est bufferisée ou non lorsque ne peut pas déterminer que le périphérique est non interactif (c'est-à-dire, sortie normale vers un terminal).
La raison pour laquelle je demande est un commentaire à ma réponse here que j'insérer une fflush(stdout);
entre les deux déclarations:
printf ("Enter number> ");
// fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
parce que je ne met fin à la printf
avec un saut de ligne. Quelqu'un peut-il éclaircir cela?
Vous ne pouvez pas "temporairement" rendre "stdout" non tamponné. 'setbuf' et' setvbuf' ont un comportement indéfini sauf s'il s'agit de la première opération effectuée sur le fichier après son ouverture. –
@R ..: Merci, vous avez raison. J'ai ajouté ceci à la réponse. – schot
Dans le cas de la mise en mémoire tampon, y at-il un filigrane haut où, si la ligne devient trop longue, elle sera rincée? – CMCDragonkai