29

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

ifstream fobj("myfile.txt");

IE。使用文件名。

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

原因:我想使用_popen(). _popen()以 a 形式返回输出FILE*。所以有一个 FILE* 指针,但没有文件名。

4

2 回答 2

5

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

或者,如果您只想要一种包装 C 文件流的对象-y 方式,则可以为此目的使用唯一指针。

于 2012-05-19T17:51:44.653 回答
-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);
于 2014-10-10T14:35:26.790 回答