loops - 如何迭代 stdin 两次?

标签 loops rust stdin

我需要为标准输入创建两个迭代器。但是,我不知道如何实现这一点。

这是一个简单的例子:

use std::io::{self, BufRead, BufReader, Result};

fn main() {
    let reader1 = BufReader::new(io::stdin()).lines();
    let reader2 = BufReader::new(io::stdin()).lines();

    for line in reader1 {
        println!("reader1: {:?}", line);
    }

    for line in reader2 {
        println!("reader2: {:?}", line);
    }
}

输出:

$ printf '1\n2\n3\n4\n' | cargo run
reader1: Ok("1")
reader1: Ok("2")
reader1: Ok("3")
reader1: Ok("4")

迭代器reader2永远不会被实现。

我想要完成的完整示例有点复杂......

use itertools::multipeek;
use std::io::{self, BufRead, BufReader, Result};

fn main() {
    let reader = BufReader::new(io::stdin()).lines();
    let mut mp = multipeek(BufReader::new(io::stdin()).lines());

    for line in reader {
        mp.next();
        match line {
            Ok(l) => {
                println!("line: {}", l);
                println!("peek: {:?}", mp.peek());
                println!("peek: {:?}", mp.peek());
            }
            Err(e) => println!("error parsing line: {:?}", e),
        }
    }
}

输出:

$ printf '1\n2\n3\n4\n' | cargo run
line: 1
peek: None
peek: None
line: 2
peek: None
peek: None
line: 3
peek: None
peek: None
line: 4
peek: None
peek: None

据我所知,它与使用 stdin 有关,因为它在从文件读取时工作正常。

最佳答案

我对 Rust 不太熟悉,无法提供具体的解决方案,但你失败了,因为在第 6-8 行你处理了 stdin(成行),然后在第 10-12 行你尝试再次处理它。但已经没有什么可以进行第二次处理了;你已经处理过了。

请记住,reader1reader2读取器,而不是缓冲区。它们不会复制输入流。

如果您希望查看先前输入的任何部分,则必须将其读入某种存储对象中。然后您可以创建一个 BufReader 或以其他方式准备对该数据的访问。

从您似乎正在做的事情来看,一种简单的方法就是创建一个 BufReader 对象来使用输入填充字符串数组。然后根据需要多次迭代该数组。

关于loops - 如何迭代 stdin 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57486991/

相关文章:

java - 如何将for循环迭代回它在java中访问的最后一个索引

java - Hangman Java 游戏打印错误和正确的猜测

java - 在循环中启动一个线程

javascript - for 循环和索引数组不起作用

reference - &&str.to_owned() 不会产生字符串

ruby - 摆脱 ruby​​ stdin/stdout 缓冲

rust - 如果 `cycle()` 永远不是 `ChunksMut`,为什么存在 `Clone?` 方法

multithreading - 简单服务器 - 如果尝试流式传输文件,线程将保持打开状态

Perl 与 Sublime Text 2 : <STDIN> not working

dart - 在 vs code 中哪里获取用户输入?使用 Dart