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


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

最佳答案

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

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


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

08-27 13:51