Dlang byLineCopy 跳行
Dlang byLineCopy skipping lines
我有以下 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
在每次迭代时跳过边界线(火星和海王星不在输出中)。我做错了什么?
听起来您希望 std.range.chunks
, combined with std.range.enumerate
保留索引:
void main()
{
foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
writefln("%s", chunk);
}
}
请注意 .array
是必需的,因为 chunks
需要 ForwardRange
而 stdin.byLineCopy
是 InputRange
。
stdin.byLineCopy
calls popFront
,这意味着在同一输入流上重复调用此函数将 'skip' 个元素。尝试在开始时仅创建一次 byLineCopy
范围:
void main()
{
auto r = stdin.byLineCopy;
while (!r.empty) {
foreach (i, e; r.take(3).enumerate) {
writefln("%d) %s", i, e);
}
}
}
您不需要检查 eof
,因为 byLineCopy
应该可以处理。
我有以下 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
在每次迭代时跳过边界线(火星和海王星不在输出中)。我做错了什么?
听起来您希望 std.range.chunks
, combined with std.range.enumerate
保留索引:
void main()
{
foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) {
writefln("%s", chunk);
}
}
请注意 .array
是必需的,因为 chunks
需要 ForwardRange
而 stdin.byLineCopy
是 InputRange
。
stdin.byLineCopy
calls popFront
,这意味着在同一输入流上重复调用此函数将 'skip' 个元素。尝试在开始时仅创建一次 byLineCopy
范围:
void main()
{
auto r = stdin.byLineCopy;
while (!r.empty) {
foreach (i, e; r.take(3).enumerate) {
writefln("%d) %s", i, e);
}
}
}
您不需要检查 eof
,因为 byLineCopy
应该可以处理。