Ada 如果输入以空格结尾,如何防止此循环读取?
我几分钟前刚接了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
> 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
。