简单的ada程序使用get_line()和put_line()产生错误的空行

Saj*_*ari 3 stdin ada

我在一个较大的程序中一直遇到这个问题,所以我制作了一个新的ada程序来对其进行测试,结果也是如此。

我有一个文本文件(Unix行尾):

000_1000_0010_1001
100_0000_0010_1001
100_1000_0000_1001
100_1000_0010_0001
100_1000_0010_1001
000_0000_0011_0011
100_1000_0100
000_0000_0110
111_1111_1111
011_1111_1111
000_0000_0110
Run Code Online (Sandbox Code Playgroud)

我要使用的方法很简单,将每行放入一个字符串中,然后直接将其打印出来。

这是我的代码:

000_1000_0010_1001
100_0000_0010_1001
100_1000_0000_1001
100_1000_0010_0001
100_1000_0010_1001
000_0000_0011_0011
100_1000_0100
000_0000_0110
111_1111_1111
011_1111_1111
000_0000_0110
Run Code Online (Sandbox Code Playgroud)

容易吧?它使用get_line接收每一行,将其保存到“ input”变量中,然后打印出所读取的任何量(使用get_line()返回的长度)。

不幸的是,当我运行以下代码时,我得到了一堆空白行:

gnatmake read read.adb
read < input.txt
Run Code Online (Sandbox Code Playgroud)
000_1000_0010_1001

100_0000_0010_1001

100_1000_0000_1001

100_1000_0010_0001

100_1000_0010_1001

000_0000_0011_0011

100_1000_0100
000_0000_0110
111_1111_1111
011_1111_1111
000_0000_0110

Run Code Online (Sandbox Code Playgroud)

我仔细检查了一下,确保我的输入文件中没有任何怪异的行尾字符或类似的字符(我只是在vim中输入了它们)。

这弄乱了我的程序,因为我必须考虑这些错误的空行。

知道我在做什么错吗?

egi*_*lhh 5

您的input变量可以容纳18个字符,并且Get_Line知道这一点,因此,当您的输入行长于18个字符时,它将仅读取18个字符。然后它将继续读取同一行,直到读取了另外18个字符或到达行尾为止。在您的情况下,输入行正好是 18个字符长(不计算行尾),当到达行尾时没有任何字符读入input变量(len返回0),这看起来很奇怪。

您可以将input缓冲区的长度增加到大于您能想到的任何输入的长度,或者通过使用以下命令让运行时确定行的长度function Get_Line return String;

with Ada.Text_IO; use Ada.Text_IO;
procedure Read is
begin
   while not End_Of_File loop
      declare
         input : String := Get_Line;
      begin
         Put_Line(input);
      end;
   end loop;
end Read;
Run Code Online (Sandbox Code Playgroud)