2012-09-19 32 views
0

我需要一个跨平台的方式来处理内存缓冲区为FILE*。我已经看到其他问题,指出没有可移植的方式来做到这一点(在Linux中fmemopen是我需要的,但它在Windows平台上失败)。使用setvbuf使内存缓冲区行为像FILE *

我试过使用setvbuf,它似乎工作。任何人都可以指出使用setvbuf函数的确切问题吗?

另外,我已经看到了C标准草案WG14/N1256和7.19.5.6说:

在任何时候所述阵列的内容是不确定的。

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

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

+0

对不起,我不明白这一点。您可以在C++中使用跨平台malloc或stringstream。 – rekire

+0

@rekire stringstream正是我的想法,但代码使用C FILE *代替。 – user803563

回答

2

没有,没有可行的方法来做到这一点。

使用setvbuf可能出现工作,但你真的调用未定义的行为,它会在意想不到的时间以意想不到的方式失败。正如你所提到的那样,GNU C库确实有fmemopen(3)作为扩展,但它不能移植到非GNU系统。

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

1

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

因此,缓冲区的内容在任何时候都是不确定的,如果碰巧为你工作,这是偶然的。

1

这取决于你想要用缓冲区/文件*做什么。你当然可以执行简单的操作并逃避它们,但是你不能保证所有的FILE *操作都可以像你期望的那样在内存缓冲区中执行。

对不起,是根本不存在的跨平台的单行得到充分的FILE *特性,我已经尝试过自己很多次,哈哈

你可以尝试:

  • #定义包裹特定于操作系统的逻辑
  • 进一步查看您尝试与之交互的界面。无论如何它只是在缓冲区中播放。然后在缓冲区中拼接。这就是我所做的。
  • 您的技术+信念。
+0

您能否告诉我们简单的操作是否包含读写功能? – user803563

+1

他们确实包括读/写,但这不是重点。重点是多少? FILE结构现在将为您处理您的缓冲区,并允许您执行任何符合其文件寻求义务的任务。您的缓冲区可以随时清除,也可以保持整个运行状态。 –