19

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?

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
Bryan Way
  • 1,903
  • 3
  • 17
  • 27

2 Answers2

22

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.

  • Ah, I see. Good insight, the man page for fmemopen doesn't have that explicitly stated but I see now that it is implied. – Bryan Way Apr 24 '15 at 21:26
  • +1, though to be more precise re: "you have to know how big your output will be": you have to know how big of a *chunk of output* you need *at once*. Because we can write into the memory "file", seek to the start, "drain" it (read it and write it out to the actual output or whatever you need to do with it), seek to the start again, and keep writing to the memory file. – mtraceur Jul 25 '23 at 17:46
4

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

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985