While reading through the GNU documentation on string streams I found two similar functions that do very similar things:
FILE * fmemopen (void *buf, size_t size, const char *opentype)
FILE * open_memstream (char **ptr, size_t *sizeloc)
From reading the documentation, it seems open_memstream
should be used for opening an output stream and fmemopen
for input. What catches me is the opentype
argument that you can pass to fmemopen
.
The linux manpage explains:
If buf is specified as NULL, then fmemopen() dynamically allocates a buffer size bytes long. This is useful for an application that wants to write data to a temporary buffer and then read it back again. The buffer is automatically freed when the stream is closed. Note that the caller has no way to obtain a pointer to the temporary buffer allocated by this call (but see open_memstream() below).
So what would be the point of using open_memstream
if fmemopen
can handle opening an input/output stream?
With
fmemopen
, the buffer is allocated at or before the open, and doesn't change size later. If you're going to write to it, you have to know how big your output will be before you start. Withopen_memstream
the buffer grows as you write.The
FILE*
foropen_memstream
is write-onlyPOSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html
So there is a second difference besides the dynamic allocation: the file is opened only for writing.
And since you can't change the flags of open streams, you shouldn't be able to read from the stream.
However it seems some implementations might allow this: Can I read stream produced by open_memstream()?