What's the simplest way to read a file token by token?
Carl Sturtivant
sturtivant at gmail.com
Sun Aug 11 06:48:16 PDT 2013
Thank you so much, that's exactly the kind of reply I was seeking!
On Sunday, 11 August 2013 at 00:13:10 UTC, Jonathan M Davis wrote:
> On Saturday, August 10, 2013 19:34:20 Carl Sturtivant wrote:
>> On Saturday, 10 August 2013 at 17:09:29 UTC, Carl Sturtivant
>>
>> wrote:
>> > What's the simplest way in D to read a file token by token,
>> > where the read tokens are D strings, and they are separated
>> > in
>> > the file by arbitrary non-zero amounts of white space
>> > (including spaces, tabs and newlines at a minimum)?
>>
>> I couldn't find a function that did just this, and various
>> ways I
>> implemented it seemed too complex. Is there such a function in
>> a
>> D library?
>
> If you have a string (or any range of dchar) already, you can
> use
> std.algorith.splitter:
>
> import std.algorithm;
>
> void main()
> {
> auto str = "hello world goodbye charlie.";
> assert(equal(splitter(str),
> ["hello", "world", "goodbye", "charlie."]));
> }
>
> However, reading from a file is quite a bit more problematic,
> as we don't have
> proper stream stuff yet (we're still waiting on std.io to be
> finished so that we
> can have that). And that means that what we have for reading
> files is a lot
> less flexible. In general, you're probably going to be reading
> it in line by
> line with std.stdio.byLine, in chunks of bytes via
> std.stdio.byChunk, or all
> at once with std.file.readText.
>
> Something that does what you want could certainly be built on
> top of either
> byLine or byChunk without a lot of effort, but it obviously
> doesn't work right
> out of the box. readText will work great (since you can just
> use splitter on
> its result), but it does mean reading the entire file in at
> once. Still, in
> most cases, that's what I'd do. It's only going to be a problem
> if the file is
> going to be particularly large, and since splitter is just
> slicing the string
> that you give it (rather than copying it), you shouldn't end up
> with the file
> in memory more than once.
>
> At some point, we will have full, range-compatible stream
> support in Phobos,
> and the situation will definitely improve, but for now, those
> are probably your
> best options.
>
> - Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list