使用setvbuf使内存缓冲区像FILE一样*

时间:2012-09-19 18:05:31

标签: c

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

我尝试过使用setvbuf,但它似乎有效。任何人都可以指出使用setvbuf函数的确切问题?

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

  

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

我不明白我是否使用自己的缓冲区,其内容如何不确定?

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

3 个答案:

答案 0 :(得分:2)

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

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

如果您正在使用某个需要FILE*指针的库并且您只在内存中拥有所需数据,那么您只需要将其写入临时文件并传入处理该文件。理想情况下,你的库应该提供一个替代函数,它接受一个内存指针而不是一个文件指针,但如果没有,你运气不好(你应该向图书馆作者抱怨这个缺陷)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

这取决于你想用缓冲区/ FILE *做什么。你当然可以执行简单的操作并逃脱它们,但你不能保证所有的FILE *操作都能在你的内存缓冲区中按预期运行。

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

你可以尝试:

  • #define-wrapped OS特定逻辑
  • 进一步了解您尝试与之交互的界面。在某些时候它无论如何都只是使用缓冲区。然后拼接你的缓冲区。这就是我所做的。
  • 你的技术+信仰。