setvbuf
|
Défini dans l'en-tête
<stdio.h>
|
||
| (jusqu'à C99) | ||
| (depuis C99) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
Modifie le mode de mise en mémoire tampon du flux de fichier donné
stream
comme indiqué par l'argument
mode
. De plus,
-
Si
bufferest un pointeur nul, redimensionne le tampon interne àsize. -
Si
buffern'est pas un pointeur nul, demande au flux d'utiliser le tampon fourni par l'utilisateur de taillesizecommençant àbuffer. Le flux doit être fermé (avec fclose ) avant la fin de la durée de vie du tableau pointé parbuffer. Le contenu du tableau après un appel réussi àsetvbufest indéterminé et toute tentative de l'utiliser est un comportement indéfini.
Table des matières |
Paramètres
| stream | - | le flux de fichier auquel définir le tampon | ||||||
| buffer | - | pointeur vers un tampon pour le flux à utiliser ou pointeur nul pour changer uniquement la taille et le mode | ||||||
| mode | - |
mode de tampon à utiliser. Il peut être l'une des valeurs suivantes :
|
||||||
| size | - | taille du tampon |
Valeur de retour
0 en cas de succès ou une valeur non nulle en cas d'échec.
Notes
Cette fonction ne peut être utilisée qu'après que
stream
a été associé à un fichier ouvert, mais avant toute autre opération (à l'exception d'un appel échoué à
setbuf
/
setvbuf
).
Pas tous les
size
octets seront nécessairement utilisés pour la mise en mémoire tampon : la taille réelle du tampon est généralement arrondie à un multiple de 2, un multiple de la taille de page, etc.
Sur de nombreuses implémentations, la mise en mémoire tampon par ligne n'est disponible que pour les flux d'entrée de terminal.
Une erreur courante consiste à définir le tampon de stdin ou stdout sur un tableau dont la durée de vie se termine avant la fin du programme :
La taille de tampon par défaut BUFSIZ est supposée être la taille de tampon la plus efficace pour les E/S de fichiers sur l'implémentation, mais POSIX fstat fournit souvent une estimation plus précise.
Exemple
Un cas d'utilisation pour modifier la taille du tampon est lorsqu'une taille plus appropriée est connue. (Cet exemple utilise certaines fonctions POSIX, par ex.
fileno
. Voir aussi SO :
#1
et
#2
).
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize); if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) { perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
Sortie possible :
BUFSIZ is 8192, but optimal block size is 65536
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.21.5.6 La fonction setvbuf (p. 225)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.21.5.6 La fonction setvbuf (p: 308)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.19.5.6 La fonction setvbuf (p: 273-274)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.9.5.6 La fonction setvbuf
Voir aussi
|
définit le tampon pour un flux de fichier
(fonction) |
|
|
Documentation C++
pour
setvbuf
|
|