setbuf, setbuffer, setlinebuf, setvbuf  -  stream  buffering


     #include <stdio.h>

     int setbuf(FILE *stream, char *buf));
     int setbuffer(FILE *stream, char *buf, size_tsize
     int setlinebuf(FILE *stream));
     int setvbuf(FILE *stream, char *buf, int mode , size_t


     The three types of buffering available are unbuffered, block
     buffered,  and  line  buffered.   When  an  output stream is
     unbuffered, information appears on the destination  file  or
     terminal  as soon as written; when it is block buffered many
     characters are saved up and written as a block; when  it  is
     line  buffered  characters  are  saved up until a newline is
     output or input is read from any stream attached to a termi-
     nal device (typically stdin).  The function fflush(3) may be
     used to force the block out early.  (See  fclose(3).)   Nor-
     mally  all  files  are  block  buffered.  When the first I/O
     operation occurs on a  file,  malloc(3)  is  called,  and  a
     buffer  is  obtained.   If a stream refers to a terminal (as
     stdout normally does) it is  line  buffered.   The  standard
     error stream stderr is always unbuffered by default.

     The setvbuf function may be used at any  time  on  any  open
     stream to change its buffer.  The mode parameter must be one
     of the following three macros:


               line buffered

               fully buffered

     Except for unbuffered files, the buf argument  should  point
     to  a  buffer  at least size bytes long; this buffer will be
     used instead of the current buffer.  If the argument buf  is
     NULL,  only the mode is affected; a new buffer will be allo-
     cated on the next read  or  write  operation.   The  setvbuf
     function  may  be  used at any time, but can only change the
     mode of a stream when it is not ``active'': that is,  before
     any I/O, or immediately after a call to fflush.

     The other three calls are, in  effect,  simply  aliases  for
     calls to setvbuf.  The setbuf function is exactly equivalent
     to the call

          setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

     The setbuffer function is the same, except that the size  of
     the buffer is up to the caller, rather than being determined
     by the default BUFSIZ.  The setlinebuf function  is  exactly
     equivalent to the call:

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


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


     The setbuf and setvbuf functions conform to ANSI C3.159-1989
     (``ANSI C'').


     The setbuffer and setlinebuf functions are not  portable  to
     versions  of  BSD  before  4.2BSD,  and may not be available
     under Linux.  On 4.2BSD and 4.3BSD  systems,  setbuf  always
     uses a suboptimal buffer size and should be avoided.

     You must make sure that both buf and the space it points  to
     still exist by the time stream is closed, which also happens
     at program termination.

     For example, the following is illegal:

     #include <stdio.h>
     int main()
         char buf[BUFSIZ];
         setbuf(stdin, buf);
         printf("Hello, world!\n");
         return 0;