Provided by: manpages-es_1.55-10_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 destino 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 cambiar su  búfer.   El
       parámetro modo debe ser una de las tres macros siguientes:

              _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 simplificadas 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 equivalente a la llamada:

              setvbuf(flujo, (char *)NULL, _IOLBF, 0);

VALOR DEVUELTO

       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 modificar errno en caso de fallo.  Las otras funciones no devuelven ningún
       valor.

CONFORME A

       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 */
       }

SEE ALSO

       fclose(3), fflush(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)