【问题标题】:Can I use a FILE* to initialize a C++ ostream object?我可以使用 FILE* 来初始化 C++ ostream 对象吗?
【发布时间】:2011-10-07 18:57:42
【问题描述】:

我可以使用其他地方打开的

FILE* f = ...

初始化一些std::ostream 实例的东西?像这样(伪代码):

FILE *f = ...;
std::ostream os;
os./*bind_to_f*/( f );    // HOW?
os << "Hello world" << std::endl;

【问题讨论】:

标签: c++ stream iostream


【解决方案1】:

FILE* 和流分别是 C 和 C++ 风格的 I/O 功能。由于 C++ 库并不总是知道底层 C 库的实现,因此没有办法做到这一点。另外考虑一下,如果你能做到这一点,所有权语义会是什么?

【讨论】:

    【解决方案2】:

    使用 GCC,您只需将现有文件描述符传递给构造函数 (ref):

    FILE *f = ...;
    std::ofstream os(fileno(f));
    

    构造函数:ofstream::ofstream (int fd)

    使用文件描述符 fd 创建一个用于写入已打开文件的 ofstream。

    【讨论】:

    • FILE* 不是文件描述符。
    • 而且使用文件描述符不是标准的,所以我建议不要这样做。
    • @Let_Me_Be:糟糕,但 fileno(FILE*) 从文件中返回 fd。
    • @John:这只是 GCC,所以无需担心常规标准。虽然我也更喜欢全标准的解决方案。
    • 其实,我想我想试试这个。我也喜欢可移植代码,是的,但在这种情况下,它可能会为我节省几百行代码。它有多糟糕? xkcd.com/292 ;-)
    【解决方案3】:

    如果您要创建一个在内部使用 FILE* 的 streambuf 类,您可以这样做。例如,HP OpenVMS 似乎有一个这样的类。

    【讨论】:

      猜你喜欢
      • 2019-12-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多