【问题标题】:Creating fstream object from a FILE* pointer从 FILE* 指针创建 fstream 对象
【发布时间】:2012-05-26 21:47:57
【问题描述】:

众所周知的创建 fstream 对象的方法是:

ifstream fobj("myfile.txt");

即。使用文件名。

但我想使用文件描述符创建一个 ifstream 对象。

原因:我想使用 _popen() 执行命令。 _popen() 将输出作为 FILE* 返回。所以有一个 FILE* 指针,但没有文件名。

【问题讨论】:

  • @Joe:Posix 文件描述符是另一回事。据推测,C++ iostream 和 C I/O 都是在 Posix 平台上根据它们实现的。不过,目前的问题更合理,因为 iostreams C I/O 都是标准库的一部分。
  • 这是stackoverflow.com/questions/2746168/… 的副本,因为您可以在从popen 返回的FILE* 上使用fileno

标签: c++ popen ifstream


【解决方案1】:

您不能仅在标准 C++ 中做到这一点,因为 iostream 和 C I/O 是完全独立且不相关的。但是,您可以编写由 C 文件流支持的 自己的 iostream。我相信 GCC 带有一个这样的流类作为库扩展。

或者,如果您想要的只是一种包装 C FILE 流的对象-y 方式,您可以为此目的 use a unique pointer

【讨论】:

  • 基本上我想将 _popen() 的输出读入单个字符串。一项小小的研究让我进入了fstream。请针对这种情况提出建议。
  • @ahmedtabrez:照常使用std::fread;使用中间缓冲区并将读取的字节附加到结果字符串中。或者查看那些 GCC 扩展。
  • 拜托,我们可以在这里讨论:chat.stackoverflow.com/rooms/11467/…
【解决方案2】:

您可以创建一个字符串,并使用 fread 读取并附加到它。它不干净,但您正在使用 C 接口。

这样的事情应该可以工作:

FILE * f = popen(...)
const unsigned N=1024;
string total;
while (true) {
    vector<char> buf[N];
    size_t read = fread((void *)&buf[0], 1, N, f);
    if (read) { total.append(buf.begin(), buf.end()); }
    if (read < N) { break; }
}
pclose(f);

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 2013-01-16
    • 1970-01-01
    • 2012-08-17
    • 2012-11-13
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多