---
name: "setbuf"
section: "3"
platform: "macos"
package: "Libc"
version: "1752.120.2"
release: "macOS 26.5"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/setbuf"
---

# setbuf(3)

stream buffering operations

## NAME

**setbuf**, **setbuffer**, **setlinebuf**, **setvbuf** – stream buffering operations

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<stdio.h\>**

*void*\

**setbuf**(*FILE \*restrict stream*, *char \*restrict buf*);

*void*\

**setbuffer**(*FILE \*stream*, *char \*buf*, *int size*);

*int*\

**setlinebuf**(*FILE \*stream*);

*int*\

**setvbuf**(*FILE \*restrict stream*, *char \*restrict buf*, *int type*, *size\_t size*);

## DESCRIPTION

Three types of buffering are available: 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 terminal device (typically stdin).

The default buffer settings can be overwritten for stdin (STDBUF0, \_STDBUF\_I ), stdout (STDBUF1, \_STDBUF\_O ), stderr (STDBUF2, \_STDBUF\_E ), or for all descriptors (STDBUF). The environment variable value is a letter followed by an optional numeric value indicating the size of the buffer. Valid sizes range from 0B to 16MB (suffixes 'k' and 'M' are accepted). Valid letters are:

- U

  Unbuffered.

- L

  Line-buffered.

- B, F

  Fully-buffered.

The function [fflush(3)](/fflush/3.md) may be used to force the block out early. (See [fclose(3)](/fclose/3.md).)

Normally, all files are block buffered. When the first I/O operation occurs on a file, [malloc(3)](/malloc/3.md) is called and an optimally-sized 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.

The **setvbuf**() function may be used to alter the buffering behavior of a stream. The *type* argument must be one of the following three macros:

- \_IONBF

  unbuffered

- \_IOLBF

  line buffered

- \_IOFBF

  fully buffered

The *size* argument may be given as zero to obtain deferred optimal-size buffer allocation as usual. If it is not zero, then 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 *buf* is not NULL, it is the caller's responsibility to [free(3)](/free/3.md) this buffer after closing the stream. (If the *size* argument is not zero but *buf* is NULL, a buffer of the given size will be allocated immediately, and released on close. This is an extension to ANSI C; portable code should use a size of 0 with any NULL buffer.)

The **setvbuf**() function may be used at any time, but may have peculiar side effects (such as discarding input or flushing output) if the stream is \`\`active''. Portable applications should call it only once on any given stream, and before any I/O is performed.

The other three calls are, in effect, simply aliases for calls to **setvbuf**(). Except for the lack of a return value, 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);
```

## RETURN VALUES

The **setvbuf**() function returns 0 on success, or EOF if the request cannot be honored (note that the stream is still functional in this case).

The **setlinebuf**() function returns what the equivalent **setvbuf**() would have returned.

## SEE ALSO

[fclose(3)](/fclose/3.md), [fopen(3)](/fopen/3.md), [fread(3)](/fread/3.md), [malloc(3)](/malloc/3.md), [printf(3)](/printf/3.md), [puts(3)](/puts/3.md)

## STANDARDS

The **setbuf**() and **setvbuf**() functions conform to ISO/IEC 9899:1990 (“ISO C90”).

## BUGS

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