Ada.Text_IO.End_Of_File 缓冲副作用
Ada.Text_IO.End_Of_File buffering side effect
在多年未接触该语言后,我正尝试在 Ada 中构建一个 REPL。
如果我在代码中检查 END_OF_FILE,Text_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 ...
如果我取消注释 while 语句,我会得到
a
--> 1 a
s
--> 2 s
d
--> 3 d
由于 End_Of_File
需要用户输入,只需将其放在您阅读用户输入的位置即可:
loop
L := L + 1;
Put ("--> ");
exit when End_Of_File;
Buffer := To_Unbounded_String (Get_Line);
Put_Line (Integer'Image(L) & " " & To_String (Buffer));
end loop;
在多年未接触该语言后,我正尝试在 Ada 中构建一个 REPL。
如果我在代码中检查 END_OF_FILE,Text_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 ...
如果我取消注释 while 语句,我会得到
a
--> 1 a
s
--> 2 s
d
--> 3 d
由于 End_Of_File
需要用户输入,只需将其放在您阅读用户输入的位置即可:
loop
L := L + 1;
Put ("--> ");
exit when End_Of_File;
Buffer := To_Unbounded_String (Get_Line);
Put_Line (Integer'Image(L) & " " & To_String (Buffer));
end loop;