fmemopen和open_memstream有什么区别?

时间:2015-04-24 14:11:41

标签: c linux stream

在阅读string streams上的GNU文档时,我发现两个类似的函数做了非常类似的事情:

FILE * fmemopen (void *buf, size_t size, const char *opentype)
FILE * open_memstream (char **ptr, size_t *sizeloc)

通过阅读文档,似乎open_memstream应该用于打开输出流,而fmemopen用于输入。让我感到惊讶的是你可以传递给opentype的{​​{1}}参数。

linux manpage explains

  

如果将buf指定为NULL,则fmemopen()动态分配a          缓冲区大小字节长。这对于想要的应用程序很有用          将数据写入临时缓冲区,然后再次读回。该          关闭流时自动释放缓冲区。注意          调用者无法获取指向临时缓冲区的指针          通过此调用分配(但请参阅下面的open_memstream())。

那么如果fmemopen可以处理打开输入/输出流,那么使用open_memstream会有什么意义呢?

2 个答案:

答案 0 :(得分:14)

使用fmemopen,缓冲区在打开时或之前分配,并且稍后不会更改大小。如果您要写信给它,您必须知道在开始之前您的输出有多大。使用open_memstream时,缓冲区会随着您的写入而增长。

答案 1 :(得分:4)

FILE* open_memstream为只写

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

  

这些函数类似于fmemopen(),只是内存总是由函数动态分配,而流仅为输出打开。

因此除了动态分配之外还有第二个区别:文件仅在写入时打开。

由于您无法更改开放流的标记,因此您无法从流中读取。

然而,似乎某些实现可能允许这样: Can I read stream produced by open_memstream()?