Dlang byLineCopy跳过线

时间:2017-04-24 15:43:04

标签: 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);
    }
  }
}

并给出以下输入

Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto

它产生输出。

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

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

2 个答案:

答案 0 :(得分:4)

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应处理该问题。

答案 1 :(得分:1)

听起来像是你想要std.range.chunks,再加上std.range.enumerate来保存索引:

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

请注意,.array需要chunksForwardRange需要stdin.byLineCopyInputRange$Paths = /some/path/1/ /some/path/2/ /some/path/3/ $Paths = $Paths.Remove($Paths.Length - 1) $Index = $Paths.LastIndexOf('/') $ID = $Paths.Substring($Index + 1)