从FILE*指针创建fstream对象

32

创建一个 fstream 对象的常用方式是:

ifstream fobj("myfile.txt");

比如使用文件名。

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

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


1
@Joe:Posix文件描述符是另一件事。据推测,在Posix平台上,C++ iostreams和C I/O都是基于它们实现的。然而,当前的问题更为合理,因为iostreams和C I/O都是标准库的一部分。 - Kerrek SB
由于您可以在从popen返回的FILE *上使用fileno,因此这是https://dev59.com/0HE85IYBdhLWcg3wgDpI的副本。 - Alnitak
3个回答

8

您不能仅使用标准的C++来实现此操作,因为iostreams和C I/O是完全独立且不相关的。但是,您可以编写自己的iostream,该iostream由C FILE流支持。我相信GCC作为库扩展提供了一种这样的流类。

或者,如果您只想以对象方式包装C FILE流,您可以使用唯一指针来实现这个目的。


基本上,我想把 _popen() 函数的输出读入一个字符串中。一番调查后,我找到了 fstream。请就此给出一些建议。 - Tabrez Ahmed
1
@ahmedtabrez:像往常一样使用std::fread,使用一个中间缓冲区,并将读取的字节追加到结果字符串中。或者研究一下那些GCC扩展。 - Kerrek SB
请问,我们可以在这里讨论吗:http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb - Tabrez Ahmed

0

他说他对Qt友好吗?问题说NIMBY。 - undefined

-3
你可以创建一个字符串,并使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接