Can you read the next line while iterating over byLine?

Jack Stouffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 2 10:34:23 PST 2017


On Thursday, 2 February 2017 at 18:18:13 UTC, John Doe wrote:
> Let's say you're trying to parse a file format like:
>
> Name
> http://example.com
> 123234
>
> Foo Bar
> http://dlang.org
> 888888
>
> with blocks separated by varying amount of blank lines.
>
> -----
> import std.stdio;
>
> void main(string[] args){
>     auto range = File("text.txt").byLine();
>
>     foreach( line; range ){
>         if (line != ""){
>             writeln(line);
>             // char[] url = range.???
>             // char[] num = range.???
>         }
>     }
> }
> -----
> How can you read the next line while iterating over a file line 
> by line, so that the next iteration uses the line after next? 
> If this isn't possible byLine is a design flaw and D should 
> instead provide a regular readLine function.
>
> btw: What is this? A forum for a programming language that 
> doesn't support code blocks?

If you understand the underlying range interface, the answer 
becomes clear:


import std.stdio;

void main(string[] args)
{
     auto range = File("text.txt").byLineCopy();

     foreach (line; range)
     {
         if (line != "")
         {
             writeln(line);
             range.popFront;
             char[] url = range.front();
             range.popFront;
             char[] num = range.front();
         }
     }
}


More information about the Digitalmars-d-learn mailing list