2012-05-19 4 views
17

Известный способ создания объекта fstream является:Создание объекта fstream из FILE * указатель

ifstream fobj("myfile.txt"); 

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

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

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

+1

@Joe: дескрипторы Posix еще одна вещь. Предположительно, как C++ iostreams, так и C I/O реализованы в терминах их на платформе Posix. Однако данный вопрос является более разумным, поскольку оба iostreams * и * C I/O являются частью стандартной библиотеки. –

+0

это дубликат http://stackoverflow.com/questions/2746168/how-to-construct-ac-fstream-from-a-posix-file-descriptor, который вы можете использовать 'fileno' в' FILE * ' вернулся из 'popen' – Alnitak

ответ

3

Вы не можете сделать это только в стандартном C++, поскольку iostreams и C I/O полностью независимы и не связаны друг с другом. Однако вы могли бы написать свой собственный iostream, который поддерживается потоком C FILE. Я считаю, что GCC поставляется с одним таким классом потока, как расширение библиотеки.

В качестве альтернативы, если все, что вы хотите, это объект-y, способ обертывания потока C FILE, вы могли бы use a unique pointer с этой целью.

+0

В основном я хочу, чтобы вывести вывод _popen() в одну строку. Небольшое исследование привело меня к потоку. Пожалуйста, предложите что-то в этом контексте. –

+1

@ahmedtabrez: Просто пойдите с 'std :: fread', как обычно; используйте промежуточный буфер и добавьте байты, которые вы читаете в строку результата. Или посмотрите на эти расширения GCC. –

+0

Пожалуйста, мы можем обсудить здесь: http://chat.stackoverflow.com/rooms/11467/room-for-ahmedtabrez-and-kerrek-sb –

-1

Вы можете создать строку и использовать 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); 
Смежные вопросы