Namespaces
Variants

setvbuf

De es.cppreference.net
< c | io
 
 
Entrada/salida de archivos
Tipos y objetos
        
Funciones
Acceso a archivos
(C95)
Entrada/salida sin formato
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Entrada formateada
Entrada/salida directa
Salida formateada
Posicionamiento en archivos
Manejo de errores
Operaciones sobre archivos
 
Definido en el encabezado <stdio.h>
int setvbuf( FILE* stream, char* buffer,
             int mode, size_t size );
(hasta C99)
int setvbuf( FILE* restrict stream, char* restrict buffer,
             int mode, size_t size );
(desde C99)
#define _IOFBF     /* unspecified */
#define _IOLBF     /* unspecified */
#define _IONBF     /* unspecified */

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 para que utilice el búfer proporcionado por el usuario de tamaño size comenzando en buffer. El flujo debe cerrarse (con fclose) antes de que termine la vida útil del arreglo apuntado por buffer. El contenido del arreglo después de una llamada exitosa a setvbuf es indeterminado y cualquier intento de usarlo es un comportamiento indefinido.

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 el modo
mode - modo de almacenamiento en búfer a usar. Puede ser uno de los siguientes valores:
_IOFBF almacenamiento en búfer completo
_IOLBF almacenamiento en búfer de línea
_IONBF sin almacenamiento en 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 usarse después de que stream se haya asociado con un archivo abierto, pero antes de cualquier otra operación (que no sea una llamada fallida a setbuf/setvbuf).

No todos los size bytes se usarán necesariamente para el búfer: el tamaño real del búfer suele redondearse 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 de línea 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 cuya vida útil termina antes de que finalice el programa:

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

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 a menudo proporciona una mejor estimación.

Ejemplo

Un caso de uso para cambiar el tamaño del búfer es cuando se conoce un tamaño mejor. (Este ejemplo usa algunas funciones POSIX, p. ej. fileno. Véase también SO: #1 y #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;
}

Posible salida:

BUFSIZ is 8192, but optimal block size is 65536

Referencias

  • Norma C23 (ISO/IEC 9899:2024):
  • 7.21.5.6 La función setvbuf (pág.: TBD)
  • Norma C17 (ISO/IEC 9899:2018):
  • 7.21.5.6 La función setvbuf (pág.: 225)
  • Norma C11 (ISO/IEC 9899:2011):
  • 7.21.5.6 La función setvbuf (pág.: 308)
  • Norma C99 (ISO/IEC 9899:1999):
  • 7.19.5.6 La función setvbuf (pág.: 273-274)
  • Norma C89/C90 (ISO/IEC 9899:1990):
  • 4.9.5.6 La función setvbuf

Véase también

establece el búfer para un flujo de archivo
(función)