0

我需要一种跨平台的方式将内存缓冲区视为FILE*. 我已经看到其他问题指出没有可移植的方法来做到这一点(linux 中的 fmemopen 是我需要的,但它在 Windows 平台上失败)。

我试过使用 setvbuf,它似乎工作。谁能指出使用 setvbuf 函数的确切问题?

另外,我看过 C 标准草案 WG14/N1256 和 7.19.5.6 说:

任何时候数组的内容都是不确定的。

我不明白如果我使用自己的缓冲区,它的内容怎么可能是不确定的?

编辑:感谢所有的答案。不再使用这种方法。

4

3 回答 3

2

不,真的,没有便携的方法可以做到这一点。

使用setvbuf可能看起来有效,但您实际上是在调用未定义的行为,并且它会在意想不到的时间以意想不到的方式失败。正如您所提到的,GNU C 库确实具有fmemopen(3)扩展,但它不能移植到非 GNU 系统。

如果您正在使用一些需要FILE*指针的库,并且内存中只有所需的数据,则只需将其写入临时文件并传入该文件的句柄即可。理想情况下,您的库应该提供一个替代函数,该函数采用内存指针而不是文件指针,但如果没有,那么您就不走运了(您应该向库编写者抱怨该缺陷)。

于 2012-09-19T18:14:29.190 回答
1

函数setvbuf()用于告诉FILE要用作缓冲区的内存,但它没有指定如何使用该内存:这取决于实现。

因此,缓冲区的内容在任何时候都是不确定的,如果它恰好对您有用,那只是偶然。

于 2012-09-19T18:15:11.877 回答
1

这取决于您想对缓冲区/文件 * 做什么。您当然可以执行简单的操作并摆脱它们,但您不能保证所有 FILE* 操作都会在您的内存缓冲区上按预期执行。

对不起,根本没有跨平台的单行来获得完整的FILE *特性,我已经尝试过很多次了哈哈

你可以尝试什么:

  • #define-wrapped 操作系统特定逻辑
  • 进一步查看您尝试与之交互的界面。在某些时候,它无论如何都只是在使用缓冲区。然后在你的缓冲区中拼接。这就是我所做的。
  • 你的技术+信念。
于 2012-09-19T18:15:29.263 回答