La primitive
int setvbuf(FILE *f,
char *adresse,
int mode,
size_t taille);
permet un changement du mode de bufferisation du fichier f avec un tampon de taille taille fourni par l'utilisateur à l'adresse adresse si elle est non nulle, avec le mode défini par les macro-définitions suivantes (<stdio.h>
):
_IOFBF bufferise
_IONBF Non bufferise
_IOMYBUF Mon buffer
_IOLBF bufferise par ligne (ex: les terminaux)
Attention: Il ne faut pas appeler cette fonction après l'allocation automatique réalisée par la bibliothèque standard après le premier appel à une fonction d'entrée-sortie sur le fichier.
Il est fortement conseillé que la zone mémoire pointée par adresse soit au moins d'une taille égale à taille.
Seul un passage au mode bufferisé en ligne ou non bufferisé peut
être réalisé après l'allocation automatique du tampon, au
risque de perdre ce tampon (absence d'appel de free). Ce qui permet par exemple de changer le mode de bufferisation de la sortie standard après un fork. Attention ce peut être dangereux, pour le contenu courant du tampon comme le montre l'exemple suivant.
Avant cette fonction de norme POSIX on utilisait trois fonctions:
void setbuf(FILE *f, char *buf); void setbuffer(FILE *f,char *adresse,size_t t); void setlignebuf(FILE *f);
#include <stdio.h> main() { printf("BonJour "); switch(fork()) { case -1 : exit(1); case 0 : printf("je suis le fils"); /* version 1 sans la ligne suivante version 2 avec */ setbuffer(stdout, NULL, 0); sleep(1); printf("Encore le fils"); break; default : printf("je suis le pere"); sleep(2); } printf("\n"); } version 1 fork_stdlib BonJour je suis le fils Encore le fils BonJour je suis le pere version 2 Encore le fils BonJour je suis le pere