Как мне взять вывод одной программы и использовать его как ввод другой на C ++? - PullRequest
4 голосов
/ 19 мая 2011

У меня есть программа, которая принимает количество экспериментов в качестве аргумента командной строки и выводит последовательность плавающих чисел.Пример: im_7.exe 10 10.41 13.33 8.806 14.95 15.55 13.88 10.13 12.22 9.09 10.45

Итак, мне нужно вызвать эту программу в моей программе и проанализировать эту последовательность чисел.

Ответы [ 3 ]

4 голосов
/ 19 мая 2011

Если вы находитесь в Windows, вам нужно сделать следующее:

  1. Создать Pipe1 с помощью API окон CreatePipe.Используйте этот канал для чтения данных из STDOUT дочернего процесса.
  2. Создайте Pipe2 таким же образом и используйте этот канал для записи данных в STDIN дочернего процесса.
  3. Создание дочернего процессаи в информации запуска укажите эти дескрипторы и наследуйте дескрипторы от родительского процесса.Также передайте аргументы строки cmd.
  4. Закройте конец записи Pipe1 и прочитайте конец Pipe2.
  5. В вашем случае вы ничего не записываете во входные данные дочернего процесса.Вы можете сразу прочитать данные из выходных данных дочернего процесса, прочитав данные из Pipe1.

Для примера посмотрите следующую ссылку.http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

Надеюсь, это то, что вы ищете.

4 голосов
/ 19 мая 2011

Данные, которые одна программа печатает на стандартный вывод (std::cout в C ++), могут быть переданы на стандартный ввод (std::cin) другой программы. Особенности соединения двух программ зависят от среды (в частности, от операционной системы и оболочки).

3 голосов
/ 19 мая 2011

Вы можете создать класс, содержащий ваши данные (с перегрузками >> и <<)

include <iostream>
#include <iterator>
#include <vector>
class MyData
{
public:
  friend 
  std::istream& 
  operator>>(std::istream& in, MyData& data)
  { 
    in >> data.size ;
    data.m_data.resize(data.size);
    std::copy( 
          std::istream_iterator<float>(in), 
          std::istream_iterator<float>( ),
          data.m_data.begin()
           );
  }
  friend
  std::ostream&
  operator<<(std::ostream& out, MyData& data)
  { 
    out<<  data.size << " ";
    for(size_t i=0;i<data.size;++i){
      out<< data.m_data[i] <<" ";
    }
    return out;
  }
private:
  int size;
  std::vector<float> m_data;
};

И затем вы можете называть его так:

int
main  (int ac, char **av)
{
  MyData d;
  std::cin>>d; //input one set of data;

  //test
  std::cout<<d;

  //get multiple data files
  std::vector<MyData> buffer;

   std::copy( 
            std::istream_iterator<MyData>(std::cin), 
            std::istream_iterator<MyData>( ),
        std::back_inserter(buffer)); // copies all data into buffer

}

Вкл.В Linux тестовая труба может быть сформирована так:

echo "4 1.1 2.2 3.3 4.4" | ./a.out

Не знаю, как делать трубы в Windows, хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...