打开 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);
现在您可以将 fp
与 stdio
函数一起使用,并通过 ptr
访问 "printed" 输出。缓冲区自动增长,应该在 fclose
ing 流后 free
d。
open_memstream
不是标准 C 而是由 POSIX.1-2008 指定的。不过有一个关于它的 ISO C TR。
对于 open_memstream
不可用的系统(如 macOS),您可以使用 fopencookie
或 funopen
来实现它,这允许您定义自己的 fread
、fwrite
、fseek
和 fclose
函数,将在对流进行操作时调用。两者都不是标准化的(第一个是 GNU 扩展,第二个是特定于 BSD 的)。
您可以在此类系统上使用 BSD libc's implementation。
对于仅实现 C 标准规定的 API 的系统,您真倒霉。您能做的最好的事情就是将输出写入临时文件(可能保存在 ramfs 或类似文件中),然后从中读取。
只有在与使用 FILE
IO 的 API 进行交互时才应执行此操作。如果这不是必需的,请考虑使用 std::stringstream
或类似的替代方法。
我正在使用的库需要一个 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);
现在您可以将 fp
与 stdio
函数一起使用,并通过 ptr
访问 "printed" 输出。缓冲区自动增长,应该在 fclose
ing 流后 free
d。
open_memstream
不是标准 C 而是由 POSIX.1-2008 指定的。不过有一个关于它的 ISO C TR。
对于 open_memstream
不可用的系统(如 macOS),您可以使用 fopencookie
或 funopen
来实现它,这允许您定义自己的 fread
、fwrite
、fseek
和 fclose
函数,将在对流进行操作时调用。两者都不是标准化的(第一个是 GNU 扩展,第二个是特定于 BSD 的)。
您可以在此类系统上使用 BSD libc's implementation。
对于仅实现 C 标准规定的 API 的系统,您真倒霉。您能做的最好的事情就是将输出写入临时文件(可能保存在 ramfs 或类似文件中),然后从中读取。
只有在与使用 FILE
IO 的 API 进行交互时才应执行此操作。如果这不是必需的,请考虑使用 std::stringstream
或类似的替代方法。