18

可能重复:
从 std::fstream 获取 FILE*

我在 Linux 上工作,文件描述符是这个操作系统的主要模型。

我想知道是否有任何库或任何方法可以从 C++ 检索本机 Linux 文件描述符std::fstream

我考虑了一下,boost::iostream因为有一个类叫做file_descriptor但我明白它的目的与我想要实现的目的不同。

你知道有什么方法吗?

4

4 回答 4

8

您可以采用另一种方式:实现您自己的包含文件描述符的流缓冲区,然后将其iostreamfstream. 使用Boost.Iostreams可以使任务更容易。

非便携式 gcc 解决方案是:

#include <ext/stdio_filebuf.h>

{
    int fd = ...;
    __gnu_cxx::stdio_filebuf<char> fd_file_buf{fd, std::ios_base::out | std::ios_base::binary};
    std::ostream fd_stream{&fd_file_buf};
    // Write into fd_stream.
    // ...
    // Flushes the stream and closes fd at scope exit.
}
于 2012-07-19T10:19:25.670 回答
4

没有(标准)方法可以从 std::fstream 中提取文件号,因为标准库没有规定如何实现文件流。

FILE*相反,如果您想这样做(使用),则需要使用 C 文件 API 。

于 2012-07-19T10:09:23.443 回答
4

没有官方方法可以获取文件流(或实际上是 a std::basic_filebuf)的私有文件句柄,只是因为它应该是可移植的并且不鼓励使用特定于平台的功能。

但是,您可以进行丑陋的 hack,例如继承std::basic_filebuf,然后尝试撬出文件句柄。这不是我推荐的东西,因为它可能会在不同版本的 C++ 库上中断。

于 2012-07-19T10:16:45.357 回答
2

标准 C++ 和libstdc++.

于 2012-07-19T10:08:50.333 回答