From: jrcarter001@my-dejanews.com
Subject: Re: Strings and reading from a file
Date: 1999/05/15
Date: 1999-05-15T00:00:00+00:00 [thread overview]
Message-ID: <7hl1ph$p3g$1@nnrp1.deja.com> (raw)
In-Reply-To: 7hf611$16i$1@cnn.Princeton.EDU
In article <7hf611$16i$1@cnn.Princeton.EDU>,
mcc@entropy.cs.princeton.edu (Martin C. Carlisle) wrote:
> I can't imagine! Probably something more like:
>
> function Next_Line(File : in Ada.Text_IO.File_Type :=
> Ada.Text_Io.Standard_Input) return String is
> Answer : String(1..256);
> Last : Natural;
> begin
> Ada.Text_IO.Get_Line(File => File,
> Item => Answer,
> Last => Last);
> if Last = Answer'Last then
> return Answer & Next_Line;
> else
> return Answer(1..Last);
> end if;
> end Next_Line;
>
> --Martin
>
> In article <7hf2bc$imm$1@nnrp1.deja.com>, <dennison@telepath.com>
wrote:
> >In article <7hevh1$g08$1@nnrp1.deja.com>,
> >> Make the function recursive, and it can return a string of any
length,
> >> eliminating that nagging worry about strings that are longer than
> >> whatever magic number you used in the function.
> >
> >Surely you don't mean (forgive me if Deja decides to throw away my
> >formatting):
> >
> >function Next_Line return String is
> > Char : Character;
> > Next_Char : Character;
> > EOL : Boolean;
> >begin
> > Get (Char);
> > Look_Ahead (Next_Char, EOL);
> > if EOL then
> > return (1 => Char);
> > else
> > return Char & Next_Line;
> > end if;
> >end Next_Line;
> >
> >I think we may have just smoked out a Lisp programmer...
I didn't expect to generate such a response...
The original inspiration for this is
Carter, J., "Variable-Length String Input in Ada", _Ada Letters_, 1989
May/Jun
which presents the following (Ada-83) algorithm:
with Text_Io;
function Get_Line (File : Text_Io.File_Type := Text_Io.Current_Input)
return String is
Char : Character;
begin -- Get_Line
if Text_Io.End_Of_Line (File) then
Text_Io.Skip_Line (File);
return "";
else
Text_Io.Get (File, Char);
return Char & Get_Line (File);
end if;
end Get_Line;
This is the output of a straightforward algorithm creation process,
which goes something like:
In Ada, it has to be a function so the result can be any length. Ok,
assume I have a function that will return the rest of the line, provided
I get the first character myself. Use that function to implement itself:
begin
Text_Io.Get (Char);
return Char & Get_Line;
end;
How do I terminate the recursion? When I'm at the end of the line. What
do I return then? A null string. End of exercise, and the function is
finished, and works correctly. Pretty it up by adding a File parameter
with appropriate default, and you're done.
However, most lines are short, and recursion for every character seems
wasteful, even though it ran as fast as I could want. My current
implementation has improved the algorithm:
with Ada.Text_Io;
use Ada;
function Get_Line (File : Text_Io.File_Type := Text_Io.Current_Input)
return String is
Line : String (1 .. 100);
Last : Natural;
begin -- Get_Line
Text_IO.Get_Line (File => File, Item => Line, Last => Last);
if Last < Line'Last then
return Line (Line'First .. Last);
else
return Line & Get_Line (File);
end if;
end Get_Line;
This is effectively the same as Carlisle's version. This does no
recursion for most lines I've encountered, and gracefully handles the
"pathological" cases. It still has trouble with those lines
that are Positive'Last characters long, especially on 32-bit machines.
--== Sent via Deja.com http://www.deja.com/ ==--
---Share what you know. Learn what you don't.---
next prev parent reply other threads:[~1999-05-15 0:00 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-05-12 0:00 Strings and reading from a file Cameron Hodge
1999-05-11 0:00 ` David Botton
1999-05-12 0:00 ` Gautier
1999-05-12 0:00 ` Robert Dewar
1999-05-12 0:00 ` dennison
1999-05-12 0:00 ` Cameron Hodge
1999-05-12 0:00 ` Marin David Condic
1999-05-12 0:00 ` Tom Moran
1999-05-12 0:00 ` Marin David Condic
1999-05-13 0:00 ` jrcarter001
1999-05-13 0:00 ` dennison
1999-05-13 0:00 ` Martin C. Carlisle
1999-05-13 0:00 ` Marin David Condic
1999-05-13 0:00 ` Keith Thompson
1999-05-14 0:00 ` Pascal Obry
1999-05-13 0:00 ` Hyman Rosen
1999-05-13 0:00 ` David Botton
1999-05-13 0:00 ` David Botton
1999-05-14 0:00 ` Jean-Pierre Rosen
1999-05-14 0:00 ` Keith Thompson
1999-05-14 0:00 ` David C. Hoos, Sr.
1999-05-14 0:00 ` Keith Thompson
1999-05-15 0:00 ` David C. Hoos, Sr.
1999-05-16 0:00 ` Jean-Pierre Rosen
1999-05-15 0:00 ` jrcarter001 [this message]
1999-06-05 0:00 ` Matthew Heaney
1999-05-12 0:00 ` David C. Hoos, Sr.
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox