8
votes

écrire () à STDOUT et sortie Printf non entrelacé?

read
read
write
write
n: 5:n: 6:

0 commentaires

5 Réponses :


1
votes

Printf utilise STDIO et il est tamponné. Poussez-le en envoyant un changement à "N:% D: \ n"


3 commentaires

Soit cela, ou ne mélangez pas les canaux de sortie - c'est-à-dire, utilisez une seule et même fonction pour produire tout le contenu.


\ n n'est pas garanti de le rincer.


STDOUT est tamponné en ligne sauf si elle est dirigée vers un périphérique non interactif.



21
votes

Printf est tamponné.

Vous pouvez forcer Printf à "affleurer" son tampon à l'aide de l'appel FFLUSH: xxx

en général, printf () < / Code> Être tamponné est une bonne chose. Sortie non coupée, en particulier pour les consoles visibles nécessitant des mises à jour d'écran et telle, est lente. Assez lent qu'une application qui est imprimée beaucoup peut être directement ralentie par celle-ci (surtout sur la plate-forme Windows; Linux et UNIXES sont généralement touchées moins).

Toutefois, printf () Être tamponné vous morde si vous FPRRTINF (STDRERR,) - STDERR est délibérément ignoré. En conséquence, vous pouvez obtenir vos messages avec certains printf () manquant; Si vous écrivez à un autre fichier de la poignée associée également à la borne, et peut être ignorée, assurez-vous de tout d'abord explicitement fflush (stdout) .


5 commentaires

Vous pouvez également modifier le mode tampon avec SETVBUF () avant de faire de l'IO.


Qu'est-ce que " printf () est tampon "?


@Mattdipasquale Printf écrit sur STDOUT et STDOUT est tamponné (par défaut). Il est seulement rincé par ex. en ligne.


Devrait également mentionner qu'une nouvelle ligne ('\ n') causera que STDOUT soit vidée


@ SOI SOIDED1: dépend de l'endroit où il pointe. Si cela va dans un fichier, il est typiquement en mémoire tampon, ce n'est que lorsqu'il passe à un terminal qu'il s'agit généralement de la ligne tamponnée.



2
votes

Le manuel pour les fgets me dit:

Il n'est pas conseillé de mélanger des appels vers des fonctions de saisie de la STDIO. bibliothèque avec des appels de bas niveau à lire (2) pour le descripteur de fichier associé avec le flux d'entrée; Les résultats seront indéfinis et très probablement pas ce que vous voulez.

La meilleure solution ne serait donc pas à utiliser d'écrire et d'imprimerf sur le même descripteur.


1 commentaires

POSIX Spécifie très soigneusement lorsque les résultats sont indéfinis et quand ils sont bien définis en fonction d'une notion abstraite de la "poignée active". Voir pubs.opengroup.org/onlinepubs/9699919799/fonctions/...< a>



0
votes

Utilisez FLERITE (version de flux) plutôt que d'écrire.

Notez que, lorsqu'il est associé au numéro de fichier 1, ce n'est pas la même chose.


0 commentaires

1
votes

Vous pouvez utiliser la fonction STD FLLUSH () pour affleurer la mémoire tampon STD OUT ou utiliser un supplément \ n à la fin de la chaîne de commande à l'intérieur du PrintF. Quelque chose comme ça xxx

c'est toujours préférable d'utiliser les fonctions d'écriture () et de lecture () en C au lieu de printf () et scanf (). Printf et Scanf ont des problèmes tels que PrintF stocke le paramètre String dans STDOUT Buffer. Donc, une affleurement manuelle est requise qui se fait via une fonction Fflush ou par des moyens de \ n. Dans un petit programme d'impression du monde Hello, vous ne trouverez pas un tel problème car le tampon Stdout est rincé à la fin de l'exécution du programme. Mieux vaut utiliser écrire () qui fonctionne bien. Scanf a également le problème des espaces de lecture et de nombreux autres problèmes liés à Stdin Buffer.

Par exemple dans le code ci-dessous: xxx

Le programme ci-dessus a obtenu le problème de la lecture \ n dans STDIN en appuyant sur Entrée. Nous pourrions résoudre ce problème mais ne pas rincer le tampon STDIN ou utiliser le caractère \ N. Toujours mieux d'utiliser les fonctions de lecture () et d'écriture ().

espère que cela aide ...


0 commentaires