Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
Definido en el encabezado <cstdio>
int setvbuf ( std:: FILE * stream, char * buffer, int mode, std:: size_t size ) ;

Cambia el modo de almacenamiento en búfer del flujo de archivo dado stream según lo indicado por el argumento mode . Además,

  • Si buffer es un puntero nulo, redimensiona el búfer interno a size .
  • Si buffer no es un puntero nulo, instruye al flujo a utilizar el búfer proporcionado por el usuario de tamaño size comenzando en buffer . El flujo debe cerrarse (con std::fclose ) antes de que finalice el tiempo de vida del array apuntado por buffer . El contenido del array después de una llamada exitosa a std::setvbuf es indeterminado y cualquier intento de utilizarlo es comportamiento indefinido.

Contenidos

Parámetros

stream - el flujo de archivo al que establecer el búfer
buffer - puntero a un búfer para que lo use el flujo o puntero nulo para cambiar solo el tamaño y modo
mode - modo de búfer a utilizar. Puede ser uno de los siguientes valores:
_IOFBF búfer completo
_IOLBF búfer por líneas
_IONBF sin búfer
size - tamaño del búfer

Valor de retorno

0 en caso de éxito o distinto de cero en caso de fallo.

Notas

Esta función solo puede utilizarse después de que stream haya sido asociado con un archivo abierto, pero antes de cualquier otra operación (excepto una llamada fallida a std::setbuf / std::setvbuf ).

No todos los size bytes se utilizarán necesariamente para el almacenamiento en búfer: el tamaño real del búfer normalmente se redondea hacia abajo a un múltiplo de 2, un múltiplo del tamaño de página, etc.

En muchas implementaciones, el almacenamiento en búfer por líneas solo está disponible para flujos de entrada de terminal.

Un error común es establecer el búfer de stdin o stdout a un arreglo cuyo tiempo de vida finaliza antes de que termine el programa:

int main()
{
    char buf[BUFSIZ];
    std::setbuf(stdin, buf);
} // la vida útil de buf termina, comportamiento indefinido

El tamaño de búfer predeterminado BUFSIZ se espera que sea el tamaño de búfer más eficiente para E/S de archivos en la implementación, pero POSIX fstat frecuentemente proporciona una estimación mejor.

Ejemplo

Un caso de uso para cambiar el tamaño del búfer es cuando se conoce un tamaño mejor.

#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;
}

Salida posible:

BUFSIZ is 8192, but optimal block size is 65536

Véase también

establece el búfer para un flujo de archivo
(función)
[virtual]
proporciona un búfer suministrado por el usuario o desactiva el búfer de este filebuf
(función miembro protegida virtual de std::basic_filebuf<CharT,Traits> )