Creating fstream object from a FILE* pointer

南笙酒味 提交于 2020-01-01 23:54:13

问题


The well known way of creating an fstream object is:

ifstream fobj("myfile.txt");

ie. using a filename.

But I want to create an ifstream object using a file descriptor.

Reason: I want to execute a command using _popen(). _popen() returns the output as a FILE*. So there is a FILE* pointer involved but no filename.


回答1:


You cannot do that just in standard C++, since iostreams and C I/O are entirely separate and unrelated. You could however write your own iostream that's backed by a C FILE stream. I believe that GCC comes with one such stream class as a library extension.

Alternatively, if all you want is an object-y way of wrapping a C FILE stream, you could use a unique pointer for that purpose.




回答2:


You can create a string, and use fread to read and append to it. It's not clean, but you're working with a C interface.

Something like this should work:

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);


来源:https://stackoverflow.com/questions/10667543/creating-fstream-object-from-a-file-pointer

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!