Mise en tampon des stdin et stdout

J’ai cette paix de code simple:

#include  int main() { fprintf(stdout , "stdout \n"); fprintf(stderr , "stduerr \n"); return 0; } Output: stdout stderr 

Je sais que stdout est tamponné et que stderr ne l’est pas et que je connais un flush de nouvelle ligne

le résultat sous Windows et netbeans est:

 stdout stderr 

le résultat en utilisant mac et Eclipse:

 stderr stdout 

et vous voulez savoir pourquoi …

Merci beaucoup …

stdout par défaut (sur votre système de toute façon) est mis en tampon de ligne, ce qui signifie qu’il sera vidé lorsque vous le videz, ou lorsque vous insérez un caractère de nouvelle ligne ‘\ n’, ce que vous faites ici:

 fprintf(stdout , "stdout \n"); 

Plus sur la mise en mémoire tampon de stdout:

Si l’on sait que stdout ne fait pas référence à un périphérique interactif, le stream est entièrement mis en mémoire tampon. Autrement, la bibliothèque dépend du fait que le stream de données soit mis en tampon de ligne ou non par défaut (voir setvbuf).

La source

Avec stdio(3) les stream de sortie faisant référence à des périphériques terminaux sont mis en tampon de ligne comme stdout , tandis que stderr n’est pas en tampon.

Le programme ci-dessus se termine immédiatement après fprintf, donc stdout est vidé.

Si vous voulez voir les différences de comportement, redirigez stdout et stderr vers un fichier, puis ajoutez quelques lignes fprintf supplémentaires.

Comme d’autres l’ont déjà noté, vous obtiendrez le résultat escompté si vous utilisez

 fprintf(stdout, "STDOUT"); fprintf(stderr, "STDERR"); 

Cela est dû au fait que la sortie standard du terminal Linux par défaut est une ligne mise en mémoire tampon tandis que stderr n’est pas en mémoire tampon.

Vous devrez vider stdout ou imprimer manuellement un ‘\ n’ sur stdout avant l’impression sur stderr. Ensuite, vous le verrez avant le message stderr.

Notez qu’il est également possible de désactiver la mise en mémoire tampon pour stdout.