2017-04-24 23 views
6

boyuta sahip 3.Dlang byLineCopy atlama hatları

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); 
    } 
    } 
} 

gruba grup giriş hatları gerekiyordu ve aşağıdaki giriş

Mercury 
Venus 
Earth 
Mars 
Jupiter 
Saturn 
Uranus 
Neptune 
Pluto 

bu çıktı üretir verilmiş olan aşağıdaki D programı.

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

her tekrarında sınır çizgisini atlama (Mars ve Neptün çıkış değildir). Neyi yanlış yapıyorum? Eğer std.range.chunks istedikleri gibi

+0

hm, alma işlevinde bana bir hata gibi görünüyor. Bu arada başka bir işlev istiyorsanız, aynı şeyi elde etmek için, '.chunks (3)' kullanın, 3 uzunluk aralığını döndürür – WebFreak001

+0

@ WebFreak001 'chunks' benim için çalışmıyor. 'ByLineCopy' bir 'InputRange 'döndürür ve' chunks' 'ForwardRange''ı bekler. –

cevap

4

stdin.byLineCopycallspopFront elemanları 'atlama' Aynı giriş akışı bu çağrı tekrar anlamı. başında sadece bir kez byLineCopy aralığı oluşturmayı deneyin: Sen byLineCopy bunun üstesinden gerektiği gibi, eof denetlemek gerekmez

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

.

+0

Bu çözüm, istediğim davranışa sahiptir. Bu byLineCopy'de bir hata değil mi? –

+0

Kaynağı değiştirmek için bir aralık oluşturmayı beklemezdim. 'API' aralığı, 'front' ve sonra 'popFront''u çağırmamız gerektiğini söylüyor. Ancak, bu 'stdin' için işe yaramaz, ilk kez 'ön' erişmek için onu ilerletmek zorundasınız, yani bir şeyler elde etmek için bir ilk 'popFront''a ihtiyacımız var demektir. Buna bir hata diyebilirsiniz, buna talihsiz bir gerçeklik derim :) – rcorre

1

endeks korumak için std.range.enumerate ile birlikte Sesler: stdin.byLineCopy bir InputRange bir ForwardRange iken chunks olarak ihtiyaç duyulan .array gerektirir

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

Not söyledi.

+1

Çözümünüz çalışıyor. Ancak, tüm girdiyi bir dizide tutmanın genelinden uzak durmak isterim (bunun tek bir anda bellekte küçük bir kısmına ihtiyaç duyduğumda, bunun, .array'ın yaptığı gibi olduğuna inanıyorum). Bu, ilk başta 'chunks' yerine 'take' kullanmamın nedenlerinden biri. –

+0

Anladım. Sanırım şimdi daha iyi bir cevap verdim. Herhangi bir değer eklemezse bunu sileceğim. – rcorre