Я хотел бы отправить данные из моей программы на C ++ на внешний конвейер, например:
FILE* file = popen("my_prog -opt | other_prog", "w");
std::ostream fileStream = some_function(file);
fileStream << "some data";
Я понимаю, что не существует простого кросс-платформенного способа выполнить вторую строку, но есть ли способ сделать то же самое, используя что-то иное, кроме popen
? Мне не нужно использовать popen
, но мне нужно использовать ostream
. Его нужно будет скомпилировать как минимум с clang
и gcc
, но желательно, чтобы он работал с любым компилятором. Я мог бы также изменить способ обращения с трубопроводом, но у меня нет источника для my_prog
или other_prog
.
boost::iostreams::file_descriptor
. У него очень плохая документация, но он может вам помочь и кроссплатформенный. - person vladon   schedule 15.11.2015ostream
- person an earwig   schedule 17.11.2015fileStream
перед созданием процесса, а затем передать его как ввод вmy_prog
, или некоторые из вводимых данных неизвестны до тех пор, пока процесс не будет создан? - person 1201ProgramAlarm   schedule 17.11.2015ostream
s. - person Drew   schedule 17.11.2015std::ostream
? Не уверен в сложности, но простая, не очень оптимизированная версия, как мне кажется, могла быть завершена за один день. В чем я уверен, так это в том, что вы не должны просто писатьpopen
в своем коде: используйте класс RAII сpopen
в конструкторе иpclose
в деструкторе. - person George Sovetov   schedule 17.11.2015std::basic_ostream
?std::ostream
не предназначен для наследования от; всеstd::basic_
* классы есть. - person YSC   schedule 17.11.2015std::streambuf
, который можно передать конструкторуstd::ostream
. В результате короткого поиска в Интернете был обнаружен этот сайт, на котором, похоже, уже есть код дляFILE*
который можно легко настроить для работы на кросс-платформе. - person Simon Kraemer   schedule 17.11.2015