我试图编写一个有效的程序来计算标准输入中新行字符的数量。我写了以下程序:
with Ada.Text_IO;
procedure Main is
New_Lines : Integer := 0;
begin
while not Ada.Text_IO.End_Of_File loop
declare
Line : String := Ada.Text_IO.Get_Line;
begin
New_Lines := New_Lines + 1;
end;
end loop;
Ada.Text_IO.Put_Line (Integer'Image(New_Lines));
end Main;
如何提高效率?我注意到编译器警告不使用Line
。也许有一种方法可以指明我只是对跳到新行字符感兴趣吗?
答案 0 :(得分:3)
您可以使用Ada.Text_IO.Skip_Line
来避免将行存储在堆栈上,并删除有关您提及的Line
的警告。
程序的mofified版本:
with Ada.Text_IO;
procedure Main is
New_Lines : Integer := 0;
begin
while not Ada.Text_IO.End_Of_File loop
Ada.Text_IO.Skip_Line;
New_Lines := New_Lines + 1;
end loop;
Ada.Text_IO.Put_Line (Integer'Image(New_Lines));
end Main;
但是,除非文件终止符直接在行终止符之前,否则不能保证计算最后一行。 (虽然看起来至少GNAT会计算它)
请注意,在某些平台上,行终结符不仅仅是Windows上的新行字符,例如,它是CR + LF。