comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <jrcarter@acm.org>
Subject: Re: Get_Line
Date: Wed, 30 Oct 2002 01:30:28 GMT
Date: 2002-10-30T01:30:28+00:00	[thread overview]
Message-ID: <3DBF3659.30709@acm.org> (raw)
In-Reply-To: B7Cv9.32984$iV1.11543@nwrddc02.gnilink.net

Justin Birtwell wrote:
> Hi,
> 
> I'm having some strange behavior with Get_Line.  In a procedure called
> GetData I call Get_Line to receive input from the command line. The first
> time this function is called it behaves fine prompting the user for input.
> The second time it runs  the execution passes through Get_Line and no prompt
> appears on the command line.  Upon doing a little research in the Ref Man.
> I found a statement that talks about if Get_Line finds a line terminator it
> automatically returns.  But how can this be?   Here's the statement from the
> RM.
> 
> << A string read by Get or written by Put can extend over several lines. An
> implementation is allowed to assume that certain external files do not
> contain page terminators, in which case Get_Line and Skip_Line can return as
> soon as a line terminator is read. >>
> 
> But I'm not reading from a file?  I'm reading from the command line?  Does
> anyone understand this behavior?
> 
> Sincerely,
> Justin
> 
> P.s.  Here's a few statements leading up to the problem...
> 
>    procedure Getdata(P_Num_Of_Points: out Natural) is
>       Last:Natural:=0;
>       Buffer:String(1..80):=(1..80=>Character'val(0));
>       l_Num:Integer;
>       --Answer:Character;
>    begin
> 
>       --get input
>       --are there any invalid characters
>       --is it a valid number anyway?
>       --does the user want to use this number?
>          Ada.Text_Io.Put_Line("Enter between 1 and 6 Balloons to create in
> the box. ");
>       loop
>          begin
> 
>                                            ---This line gets skipped
> returning with an empty buffer!!!!!!!
>          if Jb.Stringfunctions.Is_Integer(Buffer(Buffer'First..Last)) then

This hardly gives us enough information for a precise reply. There is no 
call to Get_Line here; even if there was, we don't have the information 
to reason about the environment in which it is operating (due to other 
I/O that preceeds the call). However, questions such as this arise often 
enough that we can make an educated guess.

First, what you call the command line is a file called Standard_Input, 
so you are reading from a file. The Text_IO subprograms that do not take 
a File parameter read from Current_Input, which is Standard_Input unless 
you have changed it.

Second, if Get_Line returns Last < Buffer'First, then you've read an 
empty line. I assume this is what you mean by "an empty buffer". There 
are a number of ways this can happen. If a previous call to Get_Line 
returns Last = Buffer'Last, then that call has not skipped a line 
terminator, and that line terminator is still there, waiting to be 
skipped, probably by your next call to Get_Line. If your input line is 
exactly Buffer'Length characters long, then all that's you've left is 
the line terminator, resulting in an empty line to read next time.

Another source of empty lines is using Get from an instantion of one of 
the Ada.Text_IO generic packages such as Integer_IO. This do not skip a 
line terminator. They also cause other difficulties, so reading into a 
string first is a good ides.

You can skip the next line terminator by calling Skip_Line. Another 
approach is to use a function (often called Get_Line) that reads an 
entire line and skips the line terminator, and returns a String:

function Get_Line
    (File : Ada.Text_IO.File_Type := Ada.Text_IO.Current_Input)
return String;

This ensures that line terminators are always skipped. This is not 
something that comes with the language, so you'll either have to write 
your own or find one from somewhere else. One source is the PragmAda 
Reusable Components, which has such a function:

http://home.earthlink.net/~jrcarter010/pragmarc.htm

-- 
Jeff Carter
"Your mother was a hamster and your father smelt of elderberries."
Monty Python & the Holy Grail




  parent reply	other threads:[~2002-10-30  1:30 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-29 20:24 Get_Line Justin Birtwell
2002-10-29 20:55 ` Get_Line David C. Hoos
2002-10-30  1:30 ` Jeffrey Carter [this message]
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
  -- strict thread matches above, loose matches on Subject: below --
1999-07-02  0:00 GET LINE babefan
1999-07-02  0:00 ` czgrr
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   ` get_line Matthew Heaney
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
replies disabled

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