Создание объекта fstream из указателя FILE * - программирование
Подтвердить что ты не робот

Создание объекта fstream из указателя FILE *

Известный способ создания объекта fstream:

ifstream fobj("myfile.txt");

т. используя имя файла.

Но я хочу создать объект ifstream, используя файловый дескриптор.

Причина: Я хочу выполнить команду с помощью _popen() . _popen() возвращает результат как FILE*. Таким образом, есть указатель FILE *, но не имя файла.

4b9b3361

Ответ 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);