从std :: fstream获取FILE *
是否有(跨平台)从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来查看文档。