What is the difference between fmemopen and open_m

2019-02-21 11:35发布

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?

标签: c linux stream
2条回答
Bombasti
2楼-- · 2019-02-21 12:04

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. With open_memstream the buffer grows as you write.

查看更多
We Are One
3楼-- · 2019-02-21 12:14

The FILE* for open_memstream is write-only

POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html

These functions are similar to fmemopen() except that the memory is always allocated dynamically by the function, and the stream is opened only for output.

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()?

查看更多
登录 后发表回答