Non, ce n'est pas le comportement POSIX, son comportement ISO (bien, il est un comportement , mais seulement dans la mesure Posix où elles sont conformes à la norme ISO).
La sortie standard est mise en mémoire tampon de ligne si elle peut être détectée pour faire référence à un appareil interactif, sinon elle est entièrement mise en mémoire tampon. Il y a donc des situations printf
qui ne seront pas vidées, même si une nouvelle ligne est envoyée, comme:
myprog >myfile.txt
Cela est logique pour l'efficacité car, si vous interagissez avec un utilisateur, il souhaite probablement voir chaque ligne. Si vous envoyez la sortie vers un fichier, il est très probable qu'il n'y ait pas d'utilisateur à l'autre extrémité (bien que ce ne soit pas impossible, ils pourraient être en train de suivre le fichier). Maintenant, vous pourriez dire que l'utilisateur veut voir chaque personnage, mais cela pose deux problèmes.
Le premier est qu'il n'est pas très efficace. La seconde est que le mandat original de l'ANSI C était de codifier principalement les comportements existants , plutôt que d'inventer de nouveaux comportements, et ces décisions de conception ont été prises bien avant que l'ANSI ne commence le processus. De nos jours, même l'ISO procède avec beaucoup de prudence lors de la modification des règles existantes dans les normes.
Quant à la façon de gérer cela, si vous fflush (stdout)
après chaque appel de sortie que vous souhaitez voir immédiatement, cela résoudra le problème.
Alternativement, vous pouvez utiliser setvbuf
avant d'opérer stdout
, pour le mettre en mémoire tampon et vous n'aurez pas à vous soucier d'ajouter toutes ces fflush
lignes à votre code:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Il suffit de garder à l' esprit qui peut affecter les performances un peu si vous êtes envoyer la sortie vers un fichier. Gardez également à l'esprit que la prise en charge de ceci est définie par l'implémentation, non garantie par la norme.
La section ISO C99 7.19.3/3
est le bit pertinent:
Lorsqu'un flux n'est pas mis en mémoire tampon , les caractères sont censés apparaître à partir de la source ou à destination dès que possible. Sinon, les caractères peuvent être accumulés et transmis vers ou depuis l'environnement hôte sous forme de bloc.
Lorsqu'un flux est entièrement tamponné , les caractères sont destinés à être transmis vers ou depuis l'environnement hôte sous forme de bloc lorsqu'un tampon est rempli.
Lorsqu'un flux est mis en mémoire tampon de ligne , les caractères sont destinés à être transmis vers ou depuis l'environnement hôte en tant que bloc lorsqu'un caractère de nouvelle ligne est rencontré.
De plus, les caractères sont destinés à être transmis sous forme de bloc à l'environnement hôte lorsqu'un tampon est rempli, lorsqu'une entrée est demandée sur un flux non tamponné ou lorsque l'entrée est demandée sur un flux tamponné de ligne qui nécessite la transmission de caractères de l'environnement hôte. .
La prise en charge de ces caractéristiques est définie par l'implémentation et peut être affectée via les fonctions setbuf
et setvbuf
.