comp.lang.ada
 help / color / mirror / Atom feed
From: Matthew Heaney <matthew_heaney@acm.org>
Subject: Re: get_line
Date: 1998/06/06
Date: 1998-06-06T00:00:00+00:00	[thread overview]
Message-ID: <m3zpfqu68v.fsf@mheaney.ni.net> (raw)
In-Reply-To: 6lbg7h$nnv$1@goanna.cs.rmit.edu.au


Dale Stanbrough <dale@goanna.cs.rmit.edu.au> writes:

> Well, no, not quite always. If there are the exact number of characters
> in the input as will fit in the string, then it will automatically skip
> the end of line. The code above would then skip the following line as
> well.

I don't think the statement above is correct.

If there are the same number of characters in the input line as the
input buffer, Get_Line will NOT do an end-of-line automatically.  The
next Get_Line will in fact return 0 as the value of last.  (It's the 2nd
call the Get_Line that consumes the end-of-line.)

The test to make sure all of the text on the line has been
consumed is

   Last < Input_Buffer'Last

which means "you have read all the text on the current line."

To use this predicate, you'll have to make your buffer size 1 more than
the advertised maximum.

These issues and techniques are described in John Barnes' book.

> The solution is to read the characters in char by char. It is
> unfortunate that Get_Line has such a weak postcondition.

I don't think a character-by-character read is required.

Yes, it probably seems weird that you have to allocate an extra
character in your input buffer.  But you just have to do that in order
to make the test 

   if Last < Line'Last then ...;

Here is a little program that illustrates how to properly read a
maximum-sized input line.

Note that when the input is equal to the max length (5), the line
terminator is consumed, as expected.  (This is because the actual buffer
has length 6.)

Lines larger than the advertised max length are flagged as too long, and
the rest of the input line is consumed.


with Ada.Text_IO; use Ada.Text_IO;

procedure Test_Get_Line is

   Max_Length : constant Positive := 5;

   Line : String (1 .. Max_Length + 1);
   Last : Natural;

begin

   loop
      Put ("Ready: ");
      Get_Line (Line, Last);
      exit when Last = 0;

      if Last < Line'Last then
         Put_Line ("Entry '" & Line (1 .. Last) & "' is OK.");
      else
         Skip_Line;
         Put_Line ("Entry was too long.");
      end if;
   end loop;

end Test_Get_Line;


$ test_get_line
Ready: 1
Entry '1' is OK.
Ready: 12
Entry '12' is OK.
Ready: 123
Entry '123' is OK.
Ready: 1234
Entry '1234' is OK.
Ready: 12345
Entry '12345' is OK.
Ready: 123456
Entry was too long.
Ready: 1234567
Entry was too long.
Ready: 123456
Entry was too long.
Ready: 12345
Entry '12345' is OK.
Ready: 1234
Entry '1234' is OK.
Ready: 123
Entry '123' is OK.
Ready: 12
Entry '12' is OK.
Ready: 1
Entry '1' is OK.
Ready: 




  reply	other threads:[~1998-06-06  0:00 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-06-05  0:00 get_line Steve Dyrdahl
1998-06-05  0:00 ` get_line Samuel Mize
1998-06-17  0:00   ` get_line Hans Marqvardsen
1998-06-18  0:00     ` get_line John McCabe
1998-06-21  0:00       ` get_line Robert Dewar
1998-06-06  0:00 ` get_line Dale Stanbrough
1998-06-06  0:00   ` Matthew Heaney [this message]
1998-06-07  0:00     ` get_line Dale Stanbrough
1998-06-06  0:00       ` get_line Matthew Heaney
1998-06-18  0:00     ` get_line Robert I. Eachus
1998-06-06  0:00   ` get_line Robert Dewar
  -- strict thread matches above, loose matches on Subject: below --
1999-07-02  0:00 GET LINE babefan
1999-07-02  0:00 ` czgrr
2002-10-29 20:24 Get_Line Justin Birtwell
2002-10-29 20:55 ` Get_Line David C. Hoos
2002-10-30  1:30 ` Get_Line Jeffrey Carter
2002-10-30 13:33   ` Get_Line Justin Birtwell
2002-10-30 14:40     ` Get_Line Preben Randhol
2002-10-30 17:09     ` Get_Line Jean-Pierre Rosen
2002-10-30 18:08     ` Get_Line Jeffrey Carter
2002-10-30 22:42       ` Get_Line Robert A Duff
2002-10-31  0:26         ` Get_Line Chad R. Meiners
2002-10-31  0:44           ` Get_Line Robert A Duff
2002-10-31 10:32             ` Get_Line John English
2002-10-31 11:30               ` Get_Line Preben Randhol
2002-10-31 13:10                 ` Get_Line John English
2002-10-31 17:39             ` Get_Line Warren W. Gay VE3WWG
2002-10-31 21:46             ` Get_Line Chad R. Meiners
2002-11-01 16:59               ` Get_Line Robert A Duff
2002-11-01 21:04                 ` Get_Line Chad R. Meiners
2002-11-01 23:32                   ` Get_Line Matthew Heaney
2002-11-02  0:28                     ` Get_Line Chad R. Meiners
2002-10-31  8:53       ` Get_Line Preben Randhol
2002-10-31 18:04         ` Get_Line Jeffrey Carter
2002-11-01 11:18           ` Get_Line Preben Randhol
2002-10-30 14:44 ` Get_Line Preben Randhol
2002-10-31 21:55 ` Get_Line Matthew Heaney
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox