Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
Défini dans l'en-tête <cstdio>
int setvbuf ( std:: FILE * stream, char * buffer, int mode, std:: size_t size ) ;

Modifie le mode de mise en mémoire 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, indique au flux d'utiliser le tampon fourni par l'utilisateur de taille size commençant à buffer . Le flux doit être fermé (avec std::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 à std::setvbuf est 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 modifier uniquement la taille et le mode
mode - mode de tampon à utiliser. Il peut être l'une des valeurs suivantes :
_IOFBF tamponnement complet
_IOLBF tamponnement par ligne
_IONBF pas de tamponnement
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 ait été associé à un fichier ouvert, mais avant toute autre opération (à l'exception d'un appel échoué à std::setbuf / std::setvbuf ).

Tous les size octets ne seront pas 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 :

int main()
{
    char buf[BUFSIZ];
    std::setbuf(stdin, buf);
} // durée de vie de buf se termine, comportement indéfini

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 meilleure estimation.

Exemple

Un cas d'utilisation pour modifier la taille du tampon est lorsqu'une taille plus appropriée est connue.

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <sys/stat.h>
int main()
{
    std::FILE* fp = std::fopen("/tmp/test.txt", "w+");
    if (!fp)
    {
        std::perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        std::perror("fstat");
        return EXIT_FAILURE;
    }
    std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is "
              << stats.st_blksize << '\n';
    if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0)
    {
        std::perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    // Read entire file: use truss/strace to observe the read(2) syscalls used
    for (int ch; (ch = std::fgetc(fp)) != EOF;)
    {}
    std::fclose(fp);
    return EXIT_SUCCESS;
}

Sortie possible :

BUFSIZ is 8192, but optimal block size is 65536

Voir aussi

définit le tampon pour un flux de fichier
(fonction)
[virtual]
fournit un tampon fourni par l'utilisateur ou rend ce filebuf non tamponné
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )
Documentation C pour setvbuf