打开文件*以增加内存空间

Open FILE* to a growing memory space

本文关键字:增加 内存 空间 文件      更新时间:2023-10-16

我正在使用的库需要一个 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访问"打印"输出。缓冲区是自动增长的,应在fclose流后free

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

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

你可以在这样的系统上使用 BSD libc 的实现。

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


不过,仅当您与使用 IO 的 API 交互时,才应执行此操作FILE。如果这不是必需的,请考虑改用std::stringstream或类似