2017-04-24 6 views
6

Iは、サイズ3Dlang byLineCopyスキップラインは

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 

それが出力を生成するが与えられ、次のDプログラムを有しています。

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

各繰り返しで境界線をスキップします(火星と海王星は出力にありません)。私は間違って何をしていますか? stdin.byLineCopyInputRangeている間chunksForwardRangeを必要とする.arrayが必要であること

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

注:あなたがインデックスを維持するためにstd.range.enumerateと組み合わせて、std.range.chunksをしたいよう

+0

hmは私にとってtake関数のバグのようです。その間に他の関数を同じものにしたい場合は、3長さの範囲を返す '.chunks(3)'を使用してください。 – WebFreak001

+0

@ WebFreak001 'chunkks'は私のために働いていません。 'byLineCopy'は' InputRange'を返し、 'chunks'は' ForwardRange'を返します。 –

答えて

4

stdin.byLineCopycallspopFrontこれは、同じ入力ストリームでこれを繰り返し呼び出すと 'スキップ'されることを意味します。開始時に一度だけbyLineCopy範囲を作成してみてください:byLineCopyはそれを処理する必要がありますよう

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

あなたは、eofをチェックする必要はありません。

+0

このソリューションには、私が望むふるまいがあります。これは 'byLineCopy'のバグではありませんか? –

+0

私は、ソースを突然変異させるための範囲の作成を期待していません。範囲 'API'は、 'front'を呼び出してから' popFront'を呼び出さなければならないと言います。しかし、 'stdin'では最初に' front'にアクセスするためにそれを前進させる必要があります。これは、 'popFront'が最初に必要なことです。あなたはそれをバグと呼ぶことができます、私はそれを不幸な現実と呼びます:) – rcorre

1

が鳴ります。

+1

あなたのソリューションは機能します。しかし、私は一度にメモリ内の小さな部分しか必要としないときに、配列全体の入力を維持するオーバーヘッドを避けたいと思います(これは '.array'のことです)。これが、最初に「チャンク」の代わりに「テイク」を使用した理由の1つです。 –

+0

私は参照してください。私は今より良い答えを提供したと思う。私はそれが何か値を追加しない場合は、この1つを削除します。 – rcorre

関連する問題