计算Ada中的新行

时间:2017-11-03 08:20:45

标签: performance ada

我试图编写一个有效的程序来计算标准输入中新行字符的数量。我写了以下程序:

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。也许有一种方法可以指明我只是对跳到新行字符感兴趣吗?

1 个答案:

答案 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。