我有以下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
在每次迭代时跳过边界上的线(火星和海王星不在输出中)。我究竟做错了什么?
最佳答案
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
应该可以处理。