Provided by:
manpages-es_1.55-9_all 
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)