Увеличение каналов :: у iostreams нет выхода - PullRequest
1 голос
/ 20 марта 2012

Я пытаюсь использовать каналы с библиотеками boost, я просто хочу запустить фоновую программу (например, ls) и получить ее вывод в виде строки (как вы можете сделать с fopen и fread), но я действительно не могупонять почему у меня нет вывода с этим кодом:

#include <iostream>
#include <cstdio>
#include <sstream>

#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>

int
main(int argc, char** argv)
{
    using namespace boost::iostreams;

    if(argc < 2)  {
        return -1;
    }

    FILE* p = popen(argv[1], "r");

    if(! p)  {
        std::cerr << "error open pipe" << std::endl;

        return -2;
    }

    int fd = fileno(p);
    std::stringstream ss;
    ss << fd;
    std::string s = ss.str();

    file_descriptor_source pdesc(s);
    stream_buffer<file_descriptor_source> pstream(pdesc);

    std::istream is(&pstream);
    std::string out;

    while(is)  {
        std::getline(is, out);
        std::cout << out << std::endl;
    }

    pstream.close();
    pdesc.close();
    pclose(p);

    return 0;
}

Заранее спасибо.

1 Ответ

2 голосов
/ 20 марта 2012

Кажется, вы пытаетесь открыть boost::file_descriptor_source из "пути", который содержит номер дескриптора файла. Тем не менее, файл с таким именем, вероятно, не существует. То, что вы, вероятно, хотели использовать, выглядит примерно так:

if (FILE* p = popen(argv[1], "r")) 
{
    boost::iostreams::file_descriptor_source d(fileno(p), boost::iostreams::close_handle);
    boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> pstream(d);
    std::cout << &pstream;
    pclose(p);
}
...