Ada.Text\u IO.End\u文件缓冲的副作用

Ada.Text\u IO.End\u文件缓冲的副作用,io,ada,Io,Ada,在多年没有接触过该语言之后,我正试图在Ada中构建一个REPL 如果我在代码中检查\u文件的结尾,则文本\u IO缓冲输入和输出的方式会改变。我记得当时的情况是这样的,但找不到关于为什么或如何处理这一问题的描述。(我怀疑这是终端IO和基于文件的IO之间的差异) 有人能告诉我为什么Text_IO会这样做吗 with Ada.Text_IO; use Ada.Text_IO; with Ada.Exceptions; use Ada.Exceptions; with Ada.Strings.Unbo

在多年没有接触过该语言之后,我正试图在Ada中构建一个REPL

如果我在代码中检查\u文件的结尾,则文本\u IO缓冲输入和输出的方式会改变。我记得当时的情况是这样的,但找不到关于为什么或如何处理这一问题的描述。(我怀疑这是终端IO和基于文件的IO之间的差异)

有人能告诉我为什么Text_IO会这样做吗

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;


procedure fred is
        Buffer: Unbounded_String := Null_Unbounded_String;
        L : integer := 0;
begin
        -- while (not End_Of_File)
        loop
                L := L+1;
                put("--> ");
                Buffer := To_Unbounded_String(Get_Line);
                Put_Line(Integer'image(L) & " " & to_String(Buffer));
        end loop;
exception
        when END_ERROR =>
                put_line("");
                put_line("Bye ...");
end fred;
按原样运行此代码将提供

--> a
 1 a
--> s
 2 s
--> d
 3 d
-->
Bye ...
如果我取消注释,而语句

a
-->  1 a
s
-->  2 s
d
-->  3 d

由于_文件的
End_
需要用户输入,只需将其放在读取用户输入的位置即可:

循环
L:=L+1;
以“-->”号填列;
当_文件的_结束时退出;
缓冲区:=到\u无界\u字符串(获取\u行);
将_行(整数'图像(L)&“&放入_字符串(缓冲区));
端环;

好的,我想我知道答案了。文件结束函数在测试文件是否结束之前等待输入。在这种情况下,在用户输入之前不会显示提示。我想我被异常处理程序方法卡住了。是的,必须有一些输入才能确定是否已到达文件末尾。作为旁注,您可以直接使用
Ada.Text\u IO.Unbounded\u IO
输入和输出
Unbounded\u字符串。Unbounded\u IO
文件的
End\u
还有另一个问题:如果文件以空行结尾,则在读取最后一行之前,
End\u文件的
返回True。由于这些原因,我倾向于总是处理
End\u错误
,而不是使用
End\u文件