简体   繁体   中英

What is the difference between fmemopen and open_memstream?

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM