如何将文件作为过程的参数传递

knt*_*784 0 ada readfile

我正在尝试编写一个子程序来读取"grocery.txt"文件.格式如下:12 7.2橙色

第一列是整数,第二列是浮点数.第三个是字符串,直到行尾.我应该如何声明参数以及如何将文件变量作为子过程的参数传递?

 PROCEDURE Read_File(Ada.Text_IO.File_Type => in_Item,
  Item : out Grocery_Item) IS
 BEGIN
  Ada.Integer_Text_IO.Get(File => In_Item,
     Item => Grocery_Item.Quantity,
        Width => 3);
  Ada.Float_Text_IO.Get(File => In_Item, Item => Grocery_Item.Cost_Per_Item,
     Width => 3);
  Ada.Text_IO.Get_Line(Item => Grocery_Item.Item.Item_Name,
     Last => Grocery_Item.Item.Item_Name_Length);
 END Read_File;
Run Code Online (Sandbox Code Playgroud)

我一直收到错误,说我在PROCEDURE线上错过了",".

非常感谢你.

ajb*_*ajb 5

=>仅在调用过程或函数时使用.声明它们时,语法是parameter-name:[in/out/in out/access] 类型,就像你使用的那样Item : out Grocery_Item:

procedure Read_File (In_Item : in Ada.Text_IO.File_Type;  -- the "in" keyword is optional
                     Item    : out Grocery_Item) is
...
Run Code Online (Sandbox Code Playgroud)

(只是为了避免任何可能的混淆,=>也用于与程序或函数(子程序)无关的上下文.重点是当你使用子程序时,你可以=>在你调用它们时使用,但不是在你声明它时他们.)

另外,我不确定哪个是类型,哪个是参数名称:ItemGrocery_Item?如果Grocery_Item是类型,参数声明是好的,但它没有意义的使用Grocery_Item.Quantity,Grocery_Item.Item.Item_Name_Length等等,在身体,因为这不是一个类型名称的地方.也许你想说Item.Quantity,等我说不出来.如果Item实际上是类型,并且Grocery_Item将是参数的名称,那么您需要在过程的顶部切换它们:

procedure Read_File (In_Item      : in Ada.Text_IO.File_Type;  -- the "in" keyword is optional
                     Grocery_Item : out Item) is
...
Run Code Online (Sandbox Code Playgroud)

但肯定知道,我们不得不看到的声明或者什么type Item或者type Grocery_Item是.

最后,还有一件事:为什么前两个Get调用使用一个文件,但最后一个调用Get_Line不是?这将导致文件中的两次读取,第三次读取将来自键盘(可能).您可能也想将File参数添加到最后一个Get_Line.