fmemopen和open_memstream的区别

在阅读关于stringstream的GNU文档时,我发现了两个类似的function,它们做了非常相似的事情:

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

从阅读文档,似乎open_memstream应该用于打开一个输出stream和fmemopeninput。 捕捉到我的是你可以传给fmemopen

Linux的手册页说明 :

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

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

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

FILE*也是只读的

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

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

所以除了动态分配之外还有一个不同之处:打开文件只是为了阅读。

由于您不能更改打开的文件的标志,您不能直接从FILE * 读取 : 我可以读取由open_memstream()生成的流吗?