Namespaces
Variants

setvbuf

De fr.cppreference.net
< c | E/S
 
 
Entrée/sortie de fichier
Types et objets
        
Fonctions
Accès aux fichiers
(C95)
Entrée/sortie non formatée
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrée formatée
Entrée/sortie directe
Sortie formatée
Positionnement dans le fichier
Gestion des erreurs
Opérations sur les fichiers
 
Défini dans l’en-tête <stdio.h>
int setvbuf( FILE* stream, char* buffer,
             int mode, size_t size );
(jusqu’à C99)
int setvbuf( FILE* restrict stream, char* restrict buffer,
             int mode, size_t size );
(depuis C99)
#define _IOFBF     /* unspecified */
#define _IOLBF     /* unspecified */
#define _IONBF     /* unspecified */

Modifie le mode de tampon du flux de fichier donné stream comme indiqué par l’argument mode. De plus,

  • Si buffer est un pointeur nul, redimensionne le tampon interne à size.
  • Si buffer n’est pas un pointeur nul, demande au flux d’utiliser le tampon fourni par l’utilisateur de taille size commençant à buffer. Le flux doit être fermé (avec fclose) avant la fin de la durée de vie du tableau pointé par buffer. Le contenu du tableau après un appel réussi à setvbuf est indéterminé et toute tentative de l’utiliser est un comportement indéfini.

Paramètres

stream - le flux de fichier auquel affecter 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 :
_IOFBF tampon complet
_IOLBF tampon de ligne
_IONBF sans tampon
size - taille du tampon

Valeur de retour

0 en cas de succès ou non nul 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 (autre qu’un appel échoué à setbuf/setvbuf).

Tous les size octets ne seront pas nécessairement utilisés pour la mise en 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 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 :

int main(void)
{
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior

La taille de tampon par défaut BUFSIZ est censée être la taille de tampon la plus efficace pour les E/S de fichier sur l’implémentation, mais POSIX fstat fournit souvent une meilleure estimation.

Exemple

Un cas d’utilisation pour changer la taille du tampon est lorsqu’une meilleure taille est connue. (Cet exemple utilise une fonction 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 C23 (ISO/IEC 9899:2024) :
  • 7.21.5.6 La fonction setvbuf (p : TBD)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.21.5.6 La fonction setvbuf (p : 225)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.21.5.6 La fonction setvbuf (p : 308)
  • Norme C99 (ISO/IEC 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