从FILE *指针创建fstream对象

时间:2012-05-19 17:48:01

标签: c++ popen ifstream

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

ifstream fobj("myfile.txt");

即。使用文件名。

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

  

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

2 个答案:

答案 0 :(得分:3)

你不能只在标准C ++中这样做,因为iostreams和C I / O是完全独立和无关的。但是,您可以编写由C FILE流支持的自己的 iostream。我相信GCC附带了一个这样的流类作为库扩展。

或者,如果您想要的只是一种包装C FILE流的对象方式,那么您可以use a unique pointer用于此目的。

答案 1 :(得分:-1)

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