Provided by:
manpages-es_1.55-10_all 
NOMBRE
setbuf, setbuffer, setlinebuf, setvbuf - operaciones sobre buferes 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'ON
Los tres tipos disponibles de estrategias de asignacion de buferes son
sin bufer, con bufer de bloque, y con bufer de linea. Cuando un flujo
de salida esta sin bufer, la informacion aparece en el fichero de
destino o en la terminal tan pronto como se escribe; cuando esta con
bufer de bloque se guardan y escriben muchos caracteres como un bloque;
cuando esta con bufer de linea los caracteres se van guardando hasta
que se da un salto de linea o si la entrada se lee de cualquier flujo
asociado a un dispositivo de terminal (normalmente la entrada estandar
stdin). Se puede emplear la funcion fflush(3) para forzar la escritura
del bloque mas pronto de la cuenta. (Vea fclose(3).) Normalmente
todos los ficheros son de bufer de bloque. Cuando ocurre la primera
operacion de E/S en un fichero, se llama a malloc(3) y se obtiene un
bufer. Si un flujo se refiere a una terminal (como hace normalmente
stdout) es de bufer de linea. La salida estandar de errores stderr
siempre es sin bufer por defecto.
La funcion setvbuf puede emplearse en cualquier flujo abierto para
cambiar su bufer. El parametro modo debe ser una de las tres macros
siguientes:
_IONBF sin bufer
_IOLBF bufer de linea
_IOFBF bufer completo
Salvo para ficheros sin bufer, el argumento buf deberia apuntar a un
bufer de al menos tam bytes de grande; este bufer se utilizara en lugar
del actual. Si el argumento buf es NULL, solo el modo se ve afectado;
se obtendra un nuevo bufer en la siguiente operacion de lectura o
escritura. La funcion setvbuf puede ser usada solamente despues de
abrir un flujo y antes de que ninguna otra operacion se haya realizado
sobre el.
Las otras tres funciones son, en efecto, simplemente otras formas
simplificadas de llamar a setvbuf. La funcion setbuf es exactamente
equivalente a la llamada
setvbuf(flujo, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
La funcion setbuffer es lo mismo, excepto en que el tamano del bufer se
deja a la discrecion del usuario, en vez de estar determinado por el
valor por omision BUFSIZ. La funcion setlinebuf es exactamente
equivalente a la llamada:
setvbuf(flujo, (char *)NULL, _IOLBF, 0);
VALOR DEVUELTO
La funcion setvbuf devuelve 0 en caso de exito. Puede devolver
cualquier valor si falla, pero devuelve un valor distinto de cero
cuando mode es invalido o la peticion no puede ser atendida. Puede
modificar errno en caso de fallo. Las otras funciones no devuelven
ningun valor.
CONFORME A
Las funciones setbuf y setvbuf son conformes al estandar ANSI
X3.159-1989 (``C ANSI'').
FALLOS
Las funciones setbuffer y setlinebuf no son transportables a versiones
de BSD anteriores a 4.2BSD, y estan disponibles bajo Linux desde libc
4.5.21. En sistemas 4.2BSD y 4.3BSD, setbuf siempre emplea un tamano de
bufer por debajo del optimo, y debe ser evitada.
Ud. debe asegurarse de que tanto buf como el espacio al que apunte
todavia existan cuando flujo se cierre, que tambien ocurre al acabarse
el programa.
Por ejemplo, lo siguiente esta mal:
#include <stdio.h>
int main()
{
auto char buf[BUFSIZ];
setbuf(stdin, buf);
printf("iHola 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)