Запустите исполняемый файл из программы Ada и прочитайте результат - PullRequest
2 голосов
/ 13 июня 2019

Я нашел этот вопрос, и первый ответ содержит пример кода, демонстрирующего, как запустить исполняемый файл с кодом Ada. Вывод исполняемого файла записывается в стандартный вывод.

Какие опции у меня есть, чтобы прочитать выходные данные исполняемого файла для дальнейшего анализа / обработки в Ada (например, строка за строкой)?

1 Ответ

2 голосов
/ 13 июня 2019

Если вы используете GNAT, вы можете взглянуть на Get_Command_Output в пакете GNAT.Expect. Вот пример:

with Ada.Text_IO, GNAT.Expect;

procedure Main is

   Command    : constant String := "gnat";   
   Argument_1 : aliased String  := "--version";
   Input      : constant String := ""; 
   Status     : aliased Integer := 0;      

   --  Execute the command and retrieve the output.

   Output : String :=
              GNAT.Expect.Get_Command_Output
                (Command    => Command,
                 Arguments  => (1 => Argument_1'Unchecked_Access),
                 Input      => Input,
                 Status     => Status'Access,
                 Err_To_Out => False);

   --  NOTE: Cheating with Unchecked_Access, OK for demo. You may want
   --        to properly new and Free these strings (see Argument_List 
   --        type in package GNAT.OS_Lib).

begin  
   Ada.Text_IO.Put_Line (Output);
end Main;

Программа возвращается после выполнения:

$ ./main
GNAT Community 2019 (20190517-83)
Copyright (C) 1996-2019, Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Как видно, результат возвращается в виде одной строки. Вам придется разбить линию на себя.


Обновление

Обновление в ответ на некоторые комментарии ниже.

Вы также можете рассмотреть возможность использования функции system, если вы нацелены на платформу Windows (см. Также этот пост для SO). Цитирование из ссылки на функцию:

Системная функция передает команду интерпретатору команд, который выполняет строку как команду операционной системы.

Это похоже на то, что делает программа cmd.exe. Вы можете получить выходные данные команды, перенаправив ее выходные данные в файл (т. Е. Используя >), а затем впоследствии прочитав его обратно. Вот пример:

with Ada.Text_IO;              
with Ada.Text_IO.Unbounded_IO;
with Ada.Strings.Unbounded;

with Interfaces.C;
with Interfaces.C.Strings;         

procedure Main is

   use Ada.Strings.Unbounded;
   Content : Unbounded_String := Null_Unbounded_String;   

begin

   --  Execute.
   declare   

      use Interfaces.C;
      use Interfaces.C.Strings; 

      function system (command : chars_ptr) return int
        with Import, Convention => C, External_Name => "system";      

      command : chars_ptr := New_String("gnat --version > gnat_version.out");
      result  : int       := system (command); 

   begin
      --  Check value of result (omitted in this example).
      Free(Command);
   end;

   --  Read.
   declare

      use Ada.Text_IO;
      use Ada.Text_IO.Unbounded_IO;  

      Fd : File_Type;

   begin  
      Open (Fd, In_File, "./gnat_version.out");
      while not End_Of_File (Fd) loop
         Content := Content 
           & Unbounded_String'(Get_Line (Fd))
           & ASCII.CR & ASCII.LF;   --  Restore the line break removed by Get_Line.
      end loop;
      Close (fd);
   end;

   --  Show.
   Ada.Text_IO.Unbounded_IO.Put (Content);   

end Main;
...