Ada 如果输入以空格结尾,如何防止此循环读取?

Ada 如果输入以空格结尾,如何防止此循环读取?,ada,Ada,我几分钟前刚接了Ada,所以如果这是一个微不足道的问题,请原谅我 我的程序中有一个循环,如果输入以“”字符结尾,则会导致结束错误。 我的程序为正确的输入工作,但我试图捕捉一些边缘情况 > echo "1 2 3 " | ./eofloop3a raised ADA.IO_EXCEPTIONS.END_ERROR : a-textio.adb:506 有问题的循环 procedure fun1 is F : Integer; begin while (not

我几分钟前刚接了Ada,所以如果这是一个微不足道的问题,请原谅我

我的程序中有一个循环,如果输入以“”字符结尾,则会导致结束错误。 我的程序为正确的输入工作,但我试图捕捉一些边缘情况

> echo "1 2 3 " | ./eofloop3a

raised ADA.IO_EXCEPTIONS.END_ERROR : a-textio.adb:506
有问题的循环

procedure fun1 is
   F : Integer;
begin
  while (not End_Of_File) loop
    Get(F);
  end loop;
end fun1;

为什么会发生这种情况?有没有办法防止阅读越界?我在想while条件应该阻止这种情况发生。

这是预期的结果。这是因为“如果试图跳过文件终止符,则异常
End_错误
由过程传播。”在示例输入的上下文中,在读取
3
后,
End_文件
仍保持
False
。然后“跳过任何前导空格”,并在尝试读取“与数值文本语法匹配的最长字符序列”时遇到文件结尾

一种解决方案是捕获异常并根据您的用例进行处理。比如说,

procedure Fun1 is
   F : Integer;
begin
   while (not End_Of_File) loop
      Get (F);
   end loop;
exception
   when End_Error =>
      Put_Line ("Warning: Ignoring trailing non-numeric data.");
end Fun1;

也要考虑捕获<代码> DATAYORGION<代码>,如果您的程序意在拒绝畸形的整数文字。< /P> <代码>用ADA.TraceXIO;使用Ada.Text\u IO;

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main is
   Name : String := "data.txt";
   The_File : File_Type;

begin
   Open(File => The_File,
        Mode => In_File,
        Name => Name);
   
   while not End_Of_File(The_File) loop
      declare
         Str : String := Get_Line(The_File);
         Idx : Positive;
         F   : Integer;
      begin
         Idx := Str'First;
         while Idx <= Str'Last loop
            Get(From => Str(Idx..Str'Last),
                Item => F,
                Last => Idx);
            Put(F'Image);
            Idx := Idx + 1;
         end loop;
         New_Line;
      end;
   end loop;
   Close(The_File);
end Main;
使用Ada.Integer\u Text\u IO;使用Ada.Integer\u Text\u IO; 主要程序是 名称:字符串:=“data.txt”; _文件:文件类型; 开始 打开(文件=>_文件, 模式=>在_文件中, 名称=>名称); 而不是结束_文件(_文件)循环的_ 声明 Str:String:=Get_行(_文件); Idx:阳性; F:整数; 开始 Idx:=Str'First; 而Idx F,, Last=>Idx); Put(F’Image); Idx:=Idx+1; 端环; 新线; 结束; 端环; 关闭(_文件); 端干管; 没有生成异常。 一次读取一行输入文件,然后从上一行生成的字符串中读取以处理每个整数。
即使输入行包含尾随字符,也可以正常工作。

从文本文件中读取数字数据容易出错。由于输入无效,始终存在异常的可能性。我建议使用
Get\u line
阅读整行内容并对其进行解析,而不是使用
Get
进行
Integer