OPEN_MEMSTREAM(3)

NAME
open_memstream, open_wmemstream - open a write stream around an arbitrary-length string

SYNOPSIS

#include <stdio.h>

FILE *open_memstream(char **restrict buf, size_t *restrict size);

#include <wchar.h>

FILE *open_wmemstream(wchar_t **restrict buf, size_t *restrict size);

DESCRIPTION

open_memstream creates a seekable, byte-oriented FILE stream that wraps an arbitrary-length buffer, created as if by malloc. The current contents of *buf are ignored; this implementation uses *size as a hint of the maximum size expected, but does not fail if the hint was wrong. The parameters buf and size are later stored through following any call to fflush or fclose, set to the current address and usable size of the allocated string; although after fflush, the pointer is only valid until another stream operation that results in a write. Behavior is undefined if the user alters either *buf or *size prior to fclose.

open_wmemstream is like open_memstream just with the associated stream being wide-oriented. The size set in size in subsequent operations is the number of wide characters.

The stream is write-only, since the user can directly read *buf after a flush; see fmemopen for a way to wrap a string with a readable stream. The user is responsible for calling free on the final *buf after fclose.

Any time the stream is flushed, a NUL byte is written at the current position (but is not counted in the buffer length), so that the string is always NUL-terminated after at most *size bytes (or wide characters in case of open_wmemstream). However, data previously written beyond the current stream offset is not lost, and the NUL value written during a flush is restored to its previous value when seeking elsewhere in the string.

RETURNS

The return value is an open FILE pointer on success. On error, NULL is returned, and errno will be set to EINVAL if buf or size is NULL, ENOMEM if memory could not be allocated, or EMFILE if too many streams are already open.

PORTABILITY

POSIX.1-2008

Supporting OS subroutines required: sbrk.