我有下面的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在每次迭代时跳过边界线(火星和海王星不在输出中)。我做错了什么?
发布于 2017-04-24 16:30:37
stdin.byLineCopy 呼叫 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应该处理这个问题。
发布于 2017-04-24 16:06:41
听起来您希望std.range.chunks与std.range.enumerate相结合来保存索引:
void main()
{
foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
writefln("%s", chunk);
}
}注意,.array是必需的,因为chunks需要一个ForwardRange,而stdin.byLineCopy是一个InputRange。
https://stackoverflow.com/questions/43592430
复制相似问题