【问题标题】:Open FILE* to a growing memory space打开 FILE* 到不断增长的内存空间
【发布时间】:2017-03-24 16:21:01
【问题描述】:

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

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

我知道这样的事情 -

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

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

【问题讨论】:

  • 您在寻找动态分配内存之类的东西吗?还是您的问题与重定向标准输出有关?
  • C 不是 OOP 语言。您不能扩展/重载运算符或扩展类型。而FILE 是实现定义的不透明类型(分别应视为一个)。
  • @Olaf: QStringC++ 不是 C。我猜C 标签只是因为C 中的答案是可以接受的。
  • @AdrianMaire:显示的代码是C,所以我评论了C。我的评论有什么问题?我有没有说过在 C++ 中不可能做到的事情?

标签: c++ qt memory buffer


【解决方案1】:
char *ptr = NULL;
size_t size = 0;
FILE *fp = open_memstream(&ptr, &size);

现在您可以将fpstdio 函数一起使用,并通过ptr 访问“打印”输出。缓冲区是自动增长的,在fclose流之后应该是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 或类似名称。

【讨论】:

  • 我认为这几乎是glibc 唯一的答案(OS X 没有实现它)。我不认为这对提问者来说是个问题,因为fmemopen 几乎也只是glibc。顺便说一句,我不是反对者,事实上,我赞成。
  • @JeremyP funopen 用于实现 open_memstream 在 OS X 上可用。我修改了答案。
  • 这是我需要的。只需 1 条注释 - 在 fclose 后删除 ptr 后,我得到了双重免费损坏。我猜 fclose 已经负责释放资源了?
  • @ComputerEngineer88 POSIX 禁止 fclose 这样做。你在哪个平台上?
  • CentOS 6.6 Linux 版本 2.6.32-504.23.4.el6.x86_64 gcc 版本 4.4.7。编辑:我修改了我的答案。我又试了一次,我相信我在 fclose 之后删除了 FILE* 而不是 char*。删除 char* 有效。谢谢你帮我看。
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2013-01-09
  • 2017-11-09
  • 2018-09-17
相关资源
最近更新 更多