如何使用C ++写入打开的终端?

时间:2019-02-14 01:51:06

标签: c++ cygwin executable

我正在尝试与程序(xfoil)进行通信并对其命令行进行读写。 Xfoil在其内置终端中可以采用许多参数。

我可以使用system(“ path”)打开程序,但是如何向打开的xfoil终端输入更多命令?一旦可以做到,我就可以使用终端命令来做所有需要做的事情。

2 个答案:

答案 0 :(得分:0)

Tiny Process Library是用于与流程进行交互的很好的库。

签出示例6和7,用于向流程提供命令。 https://gitlab.com/eidheim/tiny-process-library/blob/master/examples.cpp

答案 1 :(得分:0)

  

如何使用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

在我的Linux系统上,终端名称的格式始终为“ / dev / pts / x”,其中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;   

//如果使用适当的智能指针,则可以避免删除。

现在到第二个终端的所有输出都使用“ 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();
}