Dlang byLineCopy 跳行

Dlang byLineCopy skipping lines

我有以下 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);
    }
  }
}

并给出以下输入

Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto

它产生输出。

0) Mercury
1) Venus
2) Earth
0) Jupiter
1) Saturn
2) Uranus
0) Pluto

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

听起来您希望 std.range.chunks, combined with std.range.enumerate 保留索引:

void main()
{
    foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
      writefln("%s", chunk);
    }
}

请注意 .array 是必需的,因为 chunks 需要 ForwardRangestdin.byLineCopyInputRange

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

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

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