打开 FILE* 到不断增长的内存 space

Open FILE* to a growing memory space

我正在使用的库需要一个 FILE* 作为输入来存储未知数量的文本。通常我可以将 cout 作为 FILE* 传递,但我想改为将这个未知大小的文本捕获到一个变量中。

有没有一种好方法可以为要填充的不断增长的缓冲区创建 FILE*?

我知道这样的事情 -

char output[1024] 
FILE *foutput = fmemopen(output, 1024, "w");

但据我了解,这将打开一个可写入的 1024 字节的固定大小缓冲区。

char *ptr = NULL;
size_t size = 0;
FILE *fp = open_memstream(&ptr, &size);

现在您可以将 fpstdio 函数一起使用,并通过 ptr 访问 "printed" 输出。缓冲区自动增长,应该在 fcloseing 流后 freed。

open_memstream 不是标准 C 而是由 POSIX.1-2008 指定的。不过有一个关于它的 ISO C TR。

对于 open_memstream 不可用的系统(如 macOS),您可以使用 fopencookiefunopen 来实现它,这允许您定义自己的 freadfwritefseekfclose 函数,将在对流进行操作时调用。两者都不是标准化的(第一个是 GNU 扩展,第二个是特定于 BSD 的)。

您可以在此类系统上使用 BSD libc's implementation

对于仅实现 C 标准规定的 API 的系统,您真倒霉。您能做的最好的事情就是将输出写入临时文件(可能保存在 ramfs 或类似文件中),然后从中读取。


只有在与使用 FILE IO 的 API 进行交互时才应执行此操作。如果这不是必需的,请考虑使用 std::stringstream 或类似的替代方法。