redirection setbuf

J’utilise setbuf afin de redirect stdout vers le buffer de caractères

Comme expliqué dans le code suivant:

#define bufSize 100 int main() { char buf[bufSize]; setbuf(stdout, buf); printf("123"); //123 is written to the buffer setbuf(stdout,NULL); //123 is written to the stdout(unwanted side effect) printf("456"); //123456 appears in the stdout } 

Comment puis-je résoudre le problème?

Autre question à ce sujet – ce code fonctionnera-t-il pour unix / linux / mac os?

* Mise à jour * Quelqu’un peut-il proposer la solution de redirection? Merci

Je ne pense pas que vous puissiez redirect stdout vers un tampon comme celui-ci. Il finit quand même par stdout . Vous spécifiez uniquement un tampon qui sera utilisé par votre stream.

Si vous utilisez setbuf(stdout, NULL) , un nouveau tampon sera créé en arrière-plan. Et ce sera l’écriture sans tampon .. c’est à dire qu’aucune couleur n’est nécessaire.

Donc, il n’y a pas d’effet secondaire ici, juste un comportement normal.


Si vous voulez redirect stdout regardez ici . Les deux premières réponses décrivent deux techniques faisant cela.

La fonction setbuf() ne redirige pas la sortie vers la mémoire tampon. Cela indique simplement à la bibliothèque d’E / S standard “utilisez ce tampon; ne l’allouez pas vous-même”.

Vous êtes également censé utiliser setbuf() une fois par stream ouvert (immédiatement après l’avoir ouvert et avant toute autre setbuf() ) et laisser le champ libre ensuite. Si vous l’utilisez plusieurs fois, vous entrez dans un comportement indéfini – et ce que vous voyez est acceptable car le comportement requirejs est indéfini.

La norme C99 dit:

§7.19.5.5 La fonction setbuf

Sauf qu’elle ne renvoie aucune valeur, la fonction setbuf est équivalente à la fonction setvbuf appelée avec les valeurs _IOFBF pour le mode et BUFSIZ pour la taille, ou (si buf est un pointeur nul), avec la valeur _IONBF pour le mode.

§7.19.5.6 La fonction setvbuf

La fonction setvbuf ne peut être utilisée qu’après que le stream pointé par stream a été associé à un fichier ouvert et avant toute autre opération (autre qu’un appel ayant échoué à setvbuf) sur le stream.

setbuf n’est pas pour la redirection. C’est en grande partie inutile sauf pour désactiver la mise en mémoire tampon afin que toutes les sorties apparaissent immédiatement. Il peut également être utilisé pour donner à stdio un tampon différent pour le FILE , mais il n’est pas obligé de l’utiliser de manière particulière, et comme stdio utilise normalement son propre tampon de bonne taille, je ne vois pas comment votre propre tampon pourrait être terriblement utile.

Si vous souhaitez redirect la sortie, vous devriez probablement poser une nouvelle question décrivant mieux quels effets vous souhaitez obtenir.