fmemopen和open_memstream有什么区别?

在阅读关于字符串流的GNU文档时,我发现了两个类似的函数,它们执行非常类似的操作:

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

从阅读文档,似乎open_memstream应该用于打开输出流和fmemopen用于输入。 抓住我的是你可以传递给fmemopen

linux手册页解释说 :

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

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

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

open_memstreamFILE*是只写的

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

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

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

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

然而,似乎某些实现可能允许这样: 我可以读取open_memstream()生成的流吗?