Dlang byLineCopy跳过线

Bal*_*ath 6 d

我有以下D程序,它应该将输入行分组为大小为3的组.

import std.stdio;
import std.range;
import std.array;

void main()
{
  while (!stdin.eof) {
    auto currentBlock = array(take(stdin.byLineCopy, 3));

    foreach (i, e; currentBlock) {
      writefln("%d) %s", i, e);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并给出以下输入

Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto
Run Code Online (Sandbox Code Playgroud)

它产生输出.

0) Mercury
1) Venus
2) Earth
0) Jupiter
1) Saturn
2) Uranus
0) Pluto
Run Code Online (Sandbox Code Playgroud)

在每次迭代时跳过边界处的线(火星和海王星不在输出中).我究竟做错了什么?

rco*_*rre 4

stdin.byLineCopy 调用 popFront,这意味着在同一输入流上重复调用此函数将“跳过”元素。byLineCopy尝试在开始时仅创建一次范围:

void main()
{
    auto r = stdin.byLineCopy;
    while (!r.empty) {
        foreach (i, e; r.take(3).enumerate) {
          writefln("%d) %s", i, e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您不需要检查eof,因为byLineCopy应该处理它。