C++ 从文件*指针创建fstream对象

C++ 从文件*指针创建fstream对象,c++,popen,ifstream,C++,Popen,Ifstream,创建fstream对象的众所周知的方法是: ifstream fobj("myfile.txt"); 即使用文件名 但是我想使用文件描述符创建一个ifstream对象 原因:我想使用\u popen()执行命令\u popen()将输出返回为文件*。所以这里有一个文件*指针,但没有文件名 你不能只在标准C++中这样做,因为IoFiels/C I/O是完全分开的和无关的。不过,您可以编写自己的iostream,该iostream由C文件流支持。我相信GCC附带了一个流类作为库扩展 或者,如果您只

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

ifstream fobj("myfile.txt");
即使用文件名

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

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


<>你不能只在标准C++中这样做,因为IoFiels/C I/O是完全分开的和无关的。不过,您可以编写自己的iostream,该iostream由C文件流支持。我相信GCC附带了一个流类作为库扩展


或者,如果您只想用object-y方式包装一个C文件流,您也可以这样做。

您可以创建一个字符串,并使用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);
FILE*f=popen(…)
常数无符号N=1024;
字符串总数;
while(true){
向量buf[N];
读取的大小=fread((void*)和buf[0],1,N,f);
if(read){total.append(buf.begin(),buf.end());}
如果(读
@Joe:Posix文件描述符是另一回事。据推测,C++ IoSt流和C I/O都是在POSIX平台上实现的。不过,现在的问题更合理,因为iostreams和C I/O都是标准库的一部分。这是给定的一个副本,您可以对从
popen
返回的
文件*
使用
fileno
,基本上我想将_popen()的输出读取为单个字符串。一点研究让我找到了fstream。请根据上下文提出一些建议。@ahmedtabrez:像往常一样使用
std::fread
;使用中间缓冲区并将读取的字节附加到结果字符串中。或者查看这些GCC扩展。请,我们可以在这里讨论: