从 Ada 程序启动可执行文件并读取结果

2024-01-16

I found this https://stackoverflow.com/questions/32663224/why-isnt-my-gnats-standout-file-descriptor-working问题和第一个答案包含一些示例代码,演示如何使用 Ada 代码启动可执行文件。可执行文件的输出被写入标准输出。

我必须使用哪些选项来读取可执行文件的输出,以便在 Ada 中进一步解析/处理(例如逐行)?


如果您使用 GNAT,那么您可能想看看Get_Command_Output in the 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.

可以看出,结果作为单个字符串返回。您必须自己进行分线。


Update

针对以下一些评论的更新。

您也可以考虑使用system https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/system-wsystem?view=vs-2019如果您的目标是 Windows 平台,则可以使用此函数(另请参阅this https://stackoverflow.com/a/56350499发布在SO上)。引用函数参考:

系统功能通过command到命令解释器,该解释器将字符串作为操作系统命令执行。

这与程序的内容类似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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Ada 程序启动可执行文件并读取结果 的相关文章

  • “在此上下文中需要子类型标记”到底是什么?

    I get Subtype mark required in this context at 子类型掩码到底是什么 为什么它在这里抱怨 main adb Open Route Route 1 3 others gt new Location
  • 访问类型声明对释放的影响

    在这两种情况下 在声明块之后 当然是在过程结束之前 是否以相同的方式释放内存 procedure allocation is type T Integer Access is access Integer begin declare P T
  • Ada 中有“this”关键字吗?

    具体来说 任务有没有办法获得对其自身的引用 例如 task type someTask type someTaskAccessor is access someTask task body someTask is pointerToTask
  • Ada:gnat gprbuild 如何链接到库中?

    在我正在处理的这个多语言 GPRBuild 项目中 我有一些 C 库文件 a 我需要链接到我的可执行文件中 是否有 gpr 属性告诉它链接什么或无论如何将 l L 开关传递给链接器 或者甚至更好 Project my library is
  • 如何在 Ada 中从其他字符串构建字符串?

    我想在日志文件中输出标题行 然后在数据之前输出一行 为此 我创建了一个标题字符串 然后输出相同数量的 但下面的代码总是失败并出现 CONSTRAINT ERROR 因为生成的字符串不是 1024 个字符 在 Ada 中 字符串赋值需要完全相
  • 如何检查一个元素是否属于一种子类型或另一种子类型?

    刚刚了解了 Ada 中的枚举和类型 决定写一个小程序来练习 with Ada Text IO use Ada Text IO with Ada Integer Text IO use Ada Integer Text IO procedur
  • 在 Ada 中实现具有访问类型的抽象函数

    我有一个名为 Statements 的包 其中包含一个名为 Statement 的抽象类型和一个名为execute 的抽象函数 在另一个包中 我有一个CompoundStatement 类型 它是一个Statement 类型 它实现了exe
  • 如何使用“单独”关键字

    我无法找出关键字separateAda 及其深度概念 请举个小例子帮助我理解 假设我有一个嵌套过程 with ada text io use ada text io procedure main is procedure proc is b
  • 使用一个字段创建 Ada 记录

    我定义了一个类型 type Foo is record bar Positive end record 我想创建一个返回记录实例的函数 function get foo return Foo is return 1 end get foo
  • Ada:操作员不直接可见

    我正在使用 GNAT GPS studio IDE 来对 Ada 进行一些训练 我遇到了包可见性问题 首先 我在名为 DScale ads 的文件中指定一个包 其中包含以下类型 package DScale is type DMajor i
  • 从大端数据中提取记录

    我有以下用于网络协议实现的代码 由于协议是大端 我想使用位顺序属性和高阶优先值 但看来我犯了一个错误 With Ada Unchecked Conversion with Ada Text IO use Ada Text IO with S
  • 单元测试期间 Ada 中的异常处理

    我正在尝试为我最近编写的一些 Ada 代码编写一些单元测试 我有一个特殊的情况 我希望得到一个异常 如果代码工作正常 我不会 但在这种情况下我所做的只是测试 而不是编写代码 如果我在测试例程中处理异常 那么我不知道如何继续在该过程中进行测试
  • C++ 中的 Ada 子类型等效项

    C 是否提供类似于 Ada 的功能subtype缩小类型 E g type Weekday is Monday Tuesday Wednesday Thursday Friday Saturday Sunday subtype Workin
  • Ada T'Class 的基础知识

    虽然有点不好意思问这个问题 但我知道这是最好的 我已经使用 Ada 编程很多年了 并且几乎可以流利地理解该语言的每个部分 然而 我似乎始终无法完全理解 T Class 借用别人的话 有人可以 像我五岁一样解释一下吗 编辑 我买它只是为了拥有
  • Ada:具有可变大小数组属性的对象

    我想在描述二维离散空间的包内创建一个标记类型 其大小在运行时确定 上下文 实施生命的游戏 https en wikipedia org wiki Conway 27s Game of Life 我发现的第一种方法是通用性 generic S
  • [“03C0”]如何匹配附件P中的语法?

    我正在编写一个工具来使用 2005 年附录 P 中提供的语法来解析 Ada 源文件 通过下面的代码 我知道 03C0 代表 希腊字母Pi 但它是合法的变量名吗 01 package Ada Numerics is 02 Pi constan
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • Ada:用可变大小的数组打包记录

    我正在寻找创建一个打包记录 它可以容纳长度从 5 50 个元素不等的数组 是否可以以这样的方式来完成此操作 以便可以在不浪费空间的情况下打包记录 当我去创建记录时 我会知道数组中有多少元素 the range of the array ty
  • Ada初学者堆栈程序

    基本上 我有 2 个文件 adb 和 ads 我对 Ada 以及如何编译 2 个文件完全陌生 该程序是一个基本的堆栈实现 编译 adb 文件时出现此编译错误 gcc c test adt stack adb abstract char st
  • 如何使用用户输入变量作为通用包的参数?

    In Stack adb我指定了两个参数 大小和类型 我想创建一个堆栈 该堆栈的数据类型与用户在我的堆栈中指定的数据类型完全相同multistack adb file 我似乎找不到一种方法来创建新的包或使用用户定义的堆栈类型变量来实例化堆栈

随机推荐

  • React Router 转换进出事件

    我对我正在开发的一个小型网站有一个相当基本的设置 我正在使用 React 和 React Router 4 现在我想在用户输入路线时添加过渡 以使用一些 javascript 动画过渡该路线的进出 但是 我不知道如何正确执行此操作 假设用户
  • 谷歌表单计时器

    我希望为我在 Google Forms 中创建的测验创建一个计时器 我在这里找到了这篇文章 如何向 Google 表单添加学校测验计时器 https stackoverflow com questions 16394435 how to a
  • 带有日期时间选择器的 SQL 语句

    希望这应该是一个简单的问题 在 Windows 窗体中使用日期时间选择器时 我希望执行 SQL 语句 如下所示 string sql SELECT FROM Jobs WHERE JobDate dtpJobDate Text 不幸的是 这
  • 动态 if 语句?

    我正在开发 生命游戏 的克隆版 无法链接维基 因为它已关闭 基本功能已完成 但我想为用户提供定义自己的规则的选项 标准的人生游戏规则是 有 2 或 3 个邻居的牢房仍然可以生存 具有 0 1 和 4 8 邻居的细胞死亡 有 3 个邻居的死亡
  • 将文件夹移动到其自己的首字母目录中

    我使用此脚本将文件夹移动到其自己的首字母目录中 echo off setlocal enabledelayedexpansion tree for d i in do set first i set first first 0 1 md f
  • FlexibleSearchQuery 响应没有数据

    我正在尝试使用获取一些数据FlexibleSearchQuery但它响应空结果 如果我设置这个查询hac gt Console gt Flexible Search我可以获得我想要的数据 这是我在 java 文件中编写查询的方式 sb ap
  • 如何检索 Mongodb 集合中的所有对象(包括 id)?

    我在用着Casbah https github com mongodb casbah and Salat https github com novus salat创建我自己的 Mongodb dao 并实现一个 getAll 方法 如下所示
  • 如何将 BufferedImage 保存为文件

    我正在使用imgscalr http www thebuzzmedia com software imgscalr java image scaling library用于调整图像大小的 Java 库 resize 方法调用的结果是 Buf
  • 将带有日期的字符串解析为日期时间对象[重复]

    这个问题在这里已经有答案了 如何将 01 Jan 1995 这样的字符串解析为Pythondatetime object 总的来说 您可以使用以下命令解析日期和时间字符串strptime功能于time or datetime模块 您的示例可
  • 如何在cocoa中模拟mac媒体键

    我需要模拟按下 mac 键盘上的媒体 功能键 从亮度到音量增大 减小的一切 这可能吗 如果是这样怎么办 我读过很多关于如何触发他们的新闻的文章 但不是这个 如果可能的话 我希望当您更改内容时 半透明的图标仍然出现在屏幕上 在 Swift 中
  • Visual C++:如何禁用特定链接器警告?

    我正在使用 CGAL 中的一个库 该库在代码编译的链接阶段会产生许多这种形式的链接警告 warning LNK4099 PDB vc80 pdb was not found with gmp vc80 mt sgd lib or at vc
  • 在android中放大图像视图时如何禁用抗锯齿?

    我有一幅像素艺术 我想放大它 问题是当我放大它时 它会因为抗锯齿而变得模糊 有没有办法直接从 xml 禁用抗锯齿功能 我希望它有用 Bitmap bmpSource BitmapFactory decodeResource getResou
  • 在 Android Studio 中运行应用程序时如何切换自动打开运行选项卡?

    有没有办法让 Android Studio 在运行应用程序时自动打开运行选项卡 解决办法是去Run gt Edit Configurations gt 选择 杂项 选项卡并检查Show logcat automatically
  • Subversion Server SSL 证书验证失败:以及其他原因

    我有一个 SVN 系统 运行得很好 但在最近升级后突然停止工作 我的设置 我有一个使用 VisualSVN Server 2 7 4 托管在 Windows 2008 服务器上的存储库 服务器使我能够随意生成自签名证书 根据需要输入我自己的
  • 从一个节点 A 到节点 B 的最大边权

    给定一个连通的无向图N节点 1 NN 1边缘 我们定义一个函数F a b where F a b 等于路径中的最大边权重a to b 我们如何找到总和F a b 对全部a b这样1 lt a b lt N 模 10 9 7 示例图 F a
  • SQL Server 2008 (R2) 的 CRUD SP 生成器

    我正在使用 SQL Server 2008 R2 是否有一个免费的脚本 实用程序可以为我的所有数据库表创建 CRUD SP 我以前有一份 但剧本丢了 Thanks I use SSMS 工具包 http www ssmstoolspack
  • C# 在运行时获取进程输出

    无论如何 是否可以重定向生成进程的标准输出并在发生时捕获它 我所看到的一切都只是在该过程完成后执行 ReadToEnd 我希望能够在打印时获得输出 Edit private void ConvertToMPEG Start the chil
  • Android 内存不足异常

    有什么办法可以处理吗OutOfMemoryException在Android中同时使用大量图片的Bitmap 我尝试了本网站给出的所有解决方案 即 GC Bitmap reset 我只是想知道在堆内存即将满之前是否可以生成警报 这样我就可以
  • ABAP ADT 先决条件?

    在 Eclipse 中建立与本地数据库的连接以开始在 ABAP 中进行开发需要什么 我已经安装了 ABAP 插件 但无法连接到数据库 有什么建议么 ABAP 开发工具 ADT https tools hana ondemand com ab
  • 从 Ada 程序启动可执行文件并读取结果

    I found this https stackoverflow com questions 32663224 why isnt my gnats standout file descriptor working问题和第一个答案包含一些示例