【问题标题】:Equivalent of open_memstream for MSVC等效于 MSVC 的 open_memstream
【发布时间】:2010-05-19 09:13:33
【问题描述】:

我在我的一个库中使用 open_memstream,但我想将此库移植到 MSVC。似乎没有等效的功能可用,但是有足够相似的东西吗?

open_memstream 所做的是它接受一个 char** 目标和大小并返回一个您可以写入的 FILE*,数据存储在动态分配的缓冲区中(可从 char** 访问争论)。关闭 FILE 时,char** 包含写入流的数据。这为构建大型复杂字符串流提供了一种简单的方法。

虽然可以从 memstream 中读取和查找,但我只写入它。

有没有办法在 MSVC 中打开类似的内存文件流?另外,这是纯 C,没有 C++。

【问题讨论】:

  • 我确实注意到 BSD 有一个名为 funopen 的函数,它允许您通过设置回调来创建自定义流,也许 MSVC 有类似的东西?

标签: c visual-c++ posix


【解决方案1】:

Windows 上的类似函数是 CreateStreamOnHGlobal()。然而,它适用于 IStream COM 接口,它不是 FILE 的直接替代品。您可能想看看 Cygwin 源代码,看看他们做了什么。

【讨论】:

  • Cygwin 似乎使用 newlib 运行时库,它实现了自己的 FILE 结构,因此实现了 fopencookie(和 open_memstream)。至少这是我在源代码中找到的。
  • 是的,这并非不可能。它必须知道 FILE* 引用了非文件类型资源。如果您不想使用 Cygwin,那么您注定要替换您的内存流代码。
【解决方案2】:

https://github.com/Snaipe/fmem 是 open_memstream 的不同平台/版本特定等效项的包装器

它依次尝试以下实现:

  • open_memstream。
  • fopencookie,具有不断增长的动态缓冲区。
  • funopen,具有不断增长的动态缓冲区。
  • WinAPI 临时内存支持文件。

当没有其他方法可用时,fmem 回退到 tmpfile()

【讨论】:

  • 老实说,这是一个很好的答案,链接库也很不错。 (虽然我个人不太会关注为所有可用的后备提供通用包装器接口,而更多地关注提供 polyfill open_memstream 实现。我认为 fopencookiefunopen 基本上可以用来创建 open_memstream。我没有t 考虑 Windows 方面的事情。但是如果你愿意在你的 polyfills 中经历未定义的行为,你实际上可以通过打开一个虚拟文件(包括/dev/null)并使用setvbuf 在某些平台上实现fmemopen .)
  • (关于滥用setvbuf 来实现fmemopen 的一个关键点是,未定义的行为在通用代码 中是极其糟糕的做法,但在向后移植的polyfills 中完全合理的公平游戏特定旧平台的功能,因为您可以只发布 polyfill 所依赖的假设,并将其留给旧/非标准系统的用户来确定该 polyfill 实现是否适用于他们,这是最终提供 polyfill 的责任谎言。)
  • 我提到fmemopen(以及如何在可以做出某些假设的平台上填充它)有两个原因。一个是如果你有一个合理的上限,open_memstream 功能,在某些情况下这可能是一个足够好的 polyfill。如果有人乐于使用 fmem 库(并因此更改他们的代码),他们也可能乐于进行较小的更改并在他们知道上界不太大的情况下使用 fmemopen 而不是 open_memstream他们的“文件”的内容。第二个是(续)
  • 这是我用open_menstream 和 polyfilling 提出的一般观点的另一个例子——我认为有时最好只用你想要的 API 进行编码,然后告诉用户“如果这个 API在你的系统上不存在,弄清楚如何为这段代码足够好地填充它,因为它是一个很棒的 AP​​I,如果我们不能编写只依赖于该 API 的代码,我们都会得到改进”。而这个答案和链接库正是因为它们显示了至少两种方法可以实现open_memstream 的polyfill。
  • @mtraceur,感谢您的 cmets 如果您考虑移植非常复杂的项目(例如 metanorma ),其中您依赖于一个小而独特的库,该库使用对 open_memstream 的调用,那么您可能不得不采用某种 polyfill。
猜你喜欢
  • 1970-01-01
  • 2014-11-14
  • 2019-02-01
  • 2016-03-02
  • 1970-01-01
  • 2020-04-07
  • 2010-11-29
  • 2010-11-08
  • 1970-01-01
相关资源
最近更新 更多