首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dlang byLineCopy跳线

Dlang byLineCopy跳线
EN

Stack Overflow用户
提问于 2017-04-24 15:43:03
回答 2查看 113关注 0票数 6

我有下面的D程序,应该是将输入行分组成3大小的组。

代码语言:javascript
复制
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);
    }
  }
}

并给出以下输入

代码语言:javascript
复制
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto

它产生输出。

代码语言:javascript
复制
0) Mercury
1) Venus
2) Earth
0) Jupiter
1) Saturn
2) Uranus
0) Pluto

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-24 16:30:37

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

代码语言:javascript
复制
void main()
{
    auto r = stdin.byLineCopy;
    while (!r.empty) {
        foreach (i, e; r.take(3).enumerate) {
          writefln("%d) %s", i, e);
        }
    }
}

您不需要检查eof,因为byLineCopy应该处理这个问题。

票数 4
EN

Stack Overflow用户

发布于 2017-04-24 16:06:41

听起来您希望std.range.chunksstd.range.enumerate相结合来保存索引:

代码语言:javascript
复制
void main()
{
    foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
      writefln("%s", chunk);
    }
}

注意,.array是必需的,因为chunks需要一个ForwardRange,而stdin.byLineCopy是一个InputRange

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43592430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档