在阅读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
会有什么意义呢?
答案 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()?