From: Ludovic Brenta <ludovic@ludovic-brenta.org>
Subject: Re: Reading the while standard input into a String
Date: Mon, 6 Jun 2011 03:27:50 -0700 (PDT)
Date: 2011-06-06T03:27:50-07:00 [thread overview]
Message-ID: <608759e5-ffb5-4223-aba4-b180f2cd83a3@x6g2000yqj.googlegroups.com> (raw)
In-Reply-To: slrniup9o1.i18.lithiumcat@sigil.instinctive.eu
Natasha Kerensikova wrote on comp.lang.ada:
> On 2011-06-06, Ludovic Brenta <ludo...@ludovic-brenta.org> wrote:
>> I'd rather process the input one fixed-length chunk at a time and
>> discard each chunk after processing (possibly by recycling the in-
>> memory buffer for the next chunk).
>
> I would do so if online processing was an option. However in the program
> containing code similar to what I posted, I cannot do any processing
> before reaching the end of input, because the processed format allows
> forward references, so references have to be gathered in a first pass on
> the whole input, before doing a second pass where dereference can take
> place.
OK, fair enough.
>> Note that reading one character at a time from a stream is quite fast
>> since streams normally use the operating system's buffered IO. Adding
>> a second layer of buffering inside your program is probably counter-
>> productive.
>
> That second layer of buffer was actually meant to reduce the number of
> Ada.Strings.Unbounded.Append calls (and the expensive reallocations that
> go with them).
Actually, Ada.Strings.Unbounded.Append itself has mechanisms to reduce
memory reallocations. But I see your point.
> However I thought that something similar to C's fread(), which can use
> efficient bulk memory copy, would be better than a loop of single
> character read (even when buffered in memory).
How about:
procedure Read_In_Chunks (Stream : in out
Ada.Streams.Root_Stream_Type'Class;
Result : out
Ada.Strings.Unbounded.Unbounded_String) is
Chunk : Ada.Streams.Stream_Element_Array (1 .. 1024);
Chunk_As_String : String (1 .. 1024);
for Chunk_As_String'Address use Chunk'Address;
Last : Natural;
begin
loop
Ada.Streams.Read (Stream => Standard_Input,
Item => Chunk,
Last => Last);
exit when Last = Chunk'First - 1; -- end of stream reached
Ada.Strings.Unbounded.Append (Result, Chunk_As_String (1 ..
Last));
exit when Last < Chunk'Last; -- end of stream reached
end loop;
end Read_In_Chunks;
--
Ludovic Brenta.
next prev parent reply other threads:[~2011-06-06 10:27 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-05 16:20 Reading the while standard input into a String Natasha Kerensikova
2011-06-06 1:49 ` robin
2011-06-06 7:18 ` Dmitry A. Kazakov
2011-06-06 10:46 ` Natasha Kerensikova
2011-06-06 12:05 ` Dmitry A. Kazakov
2011-06-06 16:55 ` Jeffrey Carter
2011-06-06 17:42 ` Pascal Obry
2011-06-06 17:43 ` Pascal Obry
2011-06-06 18:31 ` Dmitry A. Kazakov
2011-06-06 8:09 ` stefan-lucks
2011-06-06 8:33 ` Ludovic Brenta
2011-06-06 10:08 ` Natasha Kerensikova
2011-06-06 10:27 ` Ludovic Brenta [this message]
2011-06-06 10:31 ` Ludovic Brenta
2011-06-06 12:07 ` Natasha Kerensikova
2011-06-06 15:18 ` Maciej Sobczak
2011-06-06 18:18 ` Dmitry A. Kazakov
2011-06-06 18:36 ` Maciej Sobczak
2011-06-06 18:53 ` Dmitry A. Kazakov
2011-06-06 19:10 ` J-P. Rosen
2011-06-06 19:46 ` Dmitry A. Kazakov
2011-06-06 23:37 ` Shark8
2011-06-07 3:00 ` Randy Brukardt
2011-06-07 7:25 ` Dmitry A. Kazakov
2011-06-07 7:32 ` Maciej Sobczak
2011-06-07 8:51 ` Dmitry A. Kazakov
2011-06-07 3:10 ` Randy Brukardt
2011-06-06 19:06 ` J-P. Rosen
2011-06-06 19:52 ` Dmitry A. Kazakov
2011-06-07 3:15 ` Randy Brukardt
2011-06-06 22:14 ` Robert A Duff
2011-06-06 9:46 ` Georg Bauhaus
2011-06-06 11:16 ` Georg Bauhaus
2011-06-06 12:11 ` Dmitry A. Kazakov
2011-06-06 13:32 ` Georg Bauhaus
2011-06-06 14:06 ` Dmitry A. Kazakov
2011-06-06 14:14 ` Georg Bauhaus
2011-06-07 3:19 ` Randy Brukardt
2011-06-06 18:14 ` John B. Matthews
2011-06-07 10:23 ` Martin
2011-06-07 16:57 ` John B. Matthews
2011-06-07 17:22 ` Robert A Duff
2011-06-07 17:55 ` John B. Matthews
2011-06-08 0:26 ` Robert A Duff
2011-06-08 7:38 ` Egil Høvik
2011-06-08 9:27 ` Martin
2011-06-08 12:04 ` Egil Høvik
2011-06-08 18:09 ` Niklas Holsti
2011-06-09 0:46 ` Randy Brukardt
2011-06-10 8:22 ` Martin
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox