从std :: fstream获取FILE *

时间:2020-03-06 14:29:38  来源:igfitidea点击:

是否有(跨平台)从C ++ std :: fstream获取C FILE *句柄的方法?

我问的原因是因为我的C ++库接受fstream,而在一个特定的函数中,我想使用一个接受FILE *的C库。

解决方案

好吧,我们可以获取文件描述符,而我忘记了该方法是fd()还是getfd()。我使用的实现提供了这样的方法,但是语言标准不需要它们,我相信该标准不应该在乎平台是否对文件使用fd。

由此,我们可以使用fdopen(fd,mode)获得FILE *。

但是,我认为标准不需要同步STDIN / cin,STDOUT / cout和STDERR / cerr的机制。因此,如果同时使用fstream和FILE *,则缓冲可能会使我们感到混乱。

另外,如果fstream或者FILE关闭,它们可能会关闭基础fd,因此我们需要确保在关闭EITHER之前先将两者都刷新。

最简洁的答案是不。

原因是因为std :: fstream不需要使用FILE *作为其实现的一部分。因此,即使我们设法从std :: fstream对象中提取文件描述符并手动构建FILE对象,也将遇到其他问题,因为现在将有两个缓冲对象写入同一文件描述符。

真正的问题是,为什么要将std :: fstream对象转换为FILE *?

尽管我不推荐这样做,但是我们可以尝试查找funopen()
不幸的是,这不是<B>的POSIX API(它是BSD扩展名),因此其可移植性受到质疑。这也可能就是为什么我找不到有人用这样的对象包裹" std :: stream"的原因。

FILE *funopen(
              const void *cookie,
              int    (*readfn )(void *, char *, int),
              int    (*writefn)(void *, const char *, int),
              fpos_t (*seekfn) (void *, fpos_t, int),
              int    (*closefn)(void *)
             );

这允许我们构建一个" FILE"对象并指定一些将用于实际工作的函数。如果编写适当的函数,则可以从实际打开文件的std :: fstream对象中读取它们。

没有标准化的方法。我认为这是因为C ++标准化组不想假设文件句柄可以表示为fd。

大多数平台似乎确实提供了一些非标准的方法来执行此操作。

http://www.ginac.de/~kreckel/fileno/提供了有关情况的良好记录,并提供了代码,至少对于GCC,该代码隐藏了所有平台特定的细节。考虑到这只是海湾合作委员会的毛病,我认为如果可能的话,我将避免一起做这一切。

请看看这个图书馆

MDS实用程序

它解决了这个问题,因为允许将C FILE *视为C ++流。它使用Boost C ++库。我们必须使用Doxygen来查看文档。