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

Я пытаюсь установить связь с программой (xfoil), читать и писать в ее командную строку.Xfoil может принимать множество параметров в своем встроенном терминале.

Я могу открыть программу, используя систему («путь»), но как мне ввести больше команд в открытый терминал xfoil?Как только я смогу это сделать, я смогу сделать все, что мне нужно, с помощью команд терминала.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Как я могу использовать C ++ для записи в открытый терминал

В linux есть 7+ шагов:

1) открыть терминал

   I find ctrl-alt t   most convenient
   press and hold ctrl and alt, then press t

   There is also a selection LXTerminal on a mouse menu 

   Note - There is a way for your program to open a 'default' terminal, 
   and c++ can use the technique, but it is not c++, and I always seem to 
   need to change the defaults for my use.  

2) используя терминал, вы вручную находите имя терминала по:

   type the command "tty" into the terminal

Typical response on my system:

   hostname@username:~$ tty
   /dev/pts/1

Имя терминала всегда имеет вид "/ dev / pts / x" в моей системе Linuxгде x - это число.

3) Для моих программ (которые используют второй терминал) мой код принимает часть x (ответа терминала) в качестве параметра команды 1 и использует этот параметр для созданияимя файла пути (PFN) к терминалу.

std::string     aTermPFN    = "/dev/pts/";  // partial address

aTermPFN        += argv[1];  // ouput tty identified by argv[1] 

// creating /dev/pts/<argv[1]>
// thus creating PFN of "/dev/pts/1"

4) Мой код обычно предоставляет подтверждение номера во время создания.(рекомендуется)

std::cout << "accessing '" << aTermPFN 
          << "' with std::ofstream " << std::endl;

5), а затем создает (или пытается создать) объект ofstream

std::ofstream*  ansiTerm = new std::ofstream(aTermPFN); 

6) и выполняет несколько проверок на нем ...

if (!ansiTerm->is_open())
{
   std::cerr << "Can not access '" << aTermPFN << "'" << std::endl;
   assert(0); // abort 
}

7) Когда закончите с термином, обязательно очистите

ansiTerm->close(); 
delete ansiTerm;   

// вы можете избежать удаления, если используете соответствующий умный указатель.

Теперь все выходные данные этого 2-го терминала используют объект ansiTerm, в этом коде я использую более общий термин (не указатель, а ссылку): "termRef".

Примеры использования

// mostly, in the app where these sample exist, I output text at computed
// screen locations

// ansi terminals provide goto row col ansi functions
//   the style is simply position the cursor, 
termRef << m_ansi.gotoRC(3, col) << ss.str() << std::flush;
// then output text-----------------^^^^^^^^ (ss is stringstream)

// ansi terminals can clear 
void clearScr() { termRef << m_ansi.clrscr() << std::flush; }

// ansi terminals can draw simple borders (not-fancy)
{  // across top      gotoRC (int row, int col )
   termRef << m_ansi.gotoRC ( tlcRow, tlcCol+1);
   for   ( int i=0; i<borderWidth; ++i) termRef << m_acs.HLINE;
   termFlush();
}
0 голосов
/ 14 февраля 2019

Tiny Process Library - хорошая библиотека для взаимодействия с процессами.

Изучите примеры 6 и 7 для подачи команд процессу.https://gitlab.com/eidheim/tiny-process-library/blob/master/examples.cpp

...