Provided by: manpages-es_1.55-4_all bug
 

NOMBRE

        setbuf,  setbuffer,  setlinebuf, setvbuf - operaciones sobre búferes de
        flujos
 

SINOPSIS

        #include <stdio.h>
 
        void setbuf(FILE *flujo, char *buf);
        void setbuffer(FILE *flujo, char *buf, size_ttam);
        void setlinebuf(FILE *flujo);
        int setvbuf(FILE *flujo, char *buf, int modo , size_t tam);
 

DESCRIPCI N

        Los tres tipos disponibles de estrategias de asignación de búferes  son
        sin  búfer,  con búfer de bloque, y con búfer de línea. Cuando un flujo
        de salida está sin búfer, la información aparece en el fichero de  des‐
        tino o en la terminal tan pronto como se escribe; cuando está con búfer
        de bloque se guardan y  escriben  muchos  caracteres  como  un  bloque;
        cuando  está  con  búfer de línea los caracteres se van guardando hasta
        que se da un salto de línea o si la entrada se lee de  cualquier  flujo
        asociado  a un dispositivo de terminal (normalmente la entrada estándar
        stdin). Se puede emplear la función fflush(3) para forzar la  escritura
        del  bloque  más  pronto  de  la cuenta.  (Vea fclose(3).)  Normalmente
        todos los ficheros son de búfer de bloque.  Cuando  ocurre  la  primera
        operación  de  E/S  en un fichero, se llama a malloc(3) y se obtiene un
        búfer. Si un flujo se refiere a una  terminal  (como  hace  normalmente
        stdout)  es  de  búfer  de  línea. La salida estándar de errores stderr
        siempre es sin búfer por defecto.
 
        La función setvbuf puede emplearse en cualquier flujo abierto para cam‐
        biar su búfer.  El parámetro modo debe ser una de las tres macros sigu‐
        ientes:
 
               _IONBF sin búfer
 
               _IOLBF búfer de línea
 
               _IOFBF búfer completo
 
        Salvo para ficheros sin búfer, el argumento buf debería  apuntar  a  un
        búfer de al menos tam bytes de grande; este búfer se utilizará en lugar
        del actual. Si el argumento buf es NULL, sólo el modo se  ve  afectado;
        se  obtendrá  un  nuevo  búfer  en  la siguiente operación de lectura o
        escritura. La función setvbuf puede  ser  usada  solamente  después  de
        abrir  un flujo y antes de que ninguna otra operación se haya realizado
        sobre él.
 
        Las otras tres funciones son, en efecto, simplemente otras formas  sim‐
        plificadas  de  llamar  a  setvbuf.   La  función setbuf es exactamente
        equivalente a la llamada
 
               setvbuf(flujo, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
 
        La función setbuffer es lo mismo, excepto en que el tamaño del búfer se
        deja  a  la  discreción del usuario, en vez de estar determinado por el
        valor por omisión BUFSIZ.  La función setlinebuf es exactamente equiva‐
        lente a la llamada:
 
               setvbuf(flujo, (char *)NULL, _IOLBF, 0);
        La  función  setvbuf  devuelve  0  en  caso  de  éxito.  Puede devolver
        cualquier valor si falla, pero  devuelve  un  valor  distinto  de  cero
        cuando mode es inválido o la petición no puede ser atendida. Puede mod‐
        ificar errno en caso de fallo.  Las otras funciones no devuelven ningún
        valor.
        Las   funciones  setbuf  y  setvbuf  son  conformes  al  estándar  ANSI
        X3.159-1989 (‘‘C ANSI’’).
 

FALLOS

        Las funciones setbuffer y setlinebuf no son transportables a  versiones
        de  BSD  anteriores a 4.2BSD, y están disponibles bajo Linux desde libc
        4.5.21. En sistemas 4.2BSD y 4.3BSD, setbuf siempre emplea un tamaño de
        búfer por debajo del óptimo, y debe ser evitada.
 
        Ud.  debe  asegurarse  de  que  tanto buf como el espacio al que apunte
        todavía existan cuando flujo se cierre, que también ocurre al  acabarse
        el programa.
 
        Por ejemplo, lo siguiente está mal:
 
        #include <stdio.h>
        int main()
        {
            auto char buf[BUFSIZ];
 
            setbuf(stdin, buf);
            printf("¡Hola a todos!\n");
            return 0; /* Se destruye buf, se cierra stdin */
        }
        fclose(3), fflush(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)