Создание объекта fstream из указателя FILE *
Известный способ создания объекта fstream
:
ifstream fobj("myfile.txt");
т. используя имя файла.
Но я хочу создать объект ifstream, используя файловый дескриптор.
Причина: Я хочу выполнить команду с помощью _popen()
. _popen()
возвращает результат как FILE*
. Таким образом, есть указатель FILE *, но не имя файла.
Ответы
Ответ 1
Вы не можете сделать это только в стандартном С++, поскольку iostreams и C I/O полностью разделены и не связаны. Однако вы можете написать свой собственный iostream, поддерживаемый потоком C FILE. Я считаю, что GCC имеет один такой класс потока, как расширение библиотеки.
В качестве альтернативы, если вы хотите использовать объект-y для переноса потока C FILE, вы можете использовать для этой цели уникальный указатель.
Ответ 2
Вы можете создать строку и использовать 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);