io - 在 Rust 中是否有丢弃输入的标准方法?

标签 io rust stdin

在 Rust 中从 stdin 读取输入非常简单:

use std::io;

let mut some_string = String::new();
let _ = io::stdin().read_line(&mut some_string);

但有时您可能只想丢弃它而不在任何地方确认它或获取缓冲区,例如:

println!("Press Enter to close");
io::stdin().discard_input(); // discard_input() doesn't exist

它可以读取任意数量的字符,直到遇到 \n,忽略它并且不返回任何内容或返回 io::Result。有没有标准的方法,还是我必须自己实现?我跟踪 read_line 的实现到 read_untilBufRead 实现,但我不确定从那里开始是否是个好主意。

最佳答案

您可以在标准输入上实现 .discard_until_newline(),例如:

这应该是一个正确且高效的实现(使用缓冲区读取,但不将读取的部分复制到任何地方)。当然,如果您不预期任何长行并且一次只读取一个字节,它可能会简单得多。

use std::io::Stdin;
use std::io;
use std::io::prelude::*;

pub trait DiscardUntil {
    fn discard_until_newline(&mut self) -> Result<(), io::Error>;
}

impl DiscardUntil for Stdin {
    fn discard_until_newline(&mut self) -> Result<(), io::Error> {
        let mut buffered = self.lock();
        loop {
            let (consume, done) = {
                let data = try!(buffered.fill_buf());
                if data.is_empty() {
                    (0, true)
                } else if let Some(newline_pos) = data.iter().position(|b| *b == b'\n') {
                    (newline_pos + 1, true)
                } else {
                    (data.len(), false)
                }
            };
            buffered.consume(consume);
            if done {
                break;
            }
        }
        Ok(())
    }
}

fn main() {
    println!("hi");
    io::stdin().discard_until_newline().unwrap();
    println!("again");
    io::stdin().discard_until_newline().unwrap();
    println!("goodbye");
}

关于io - 在 Rust 中是否有丢弃输入的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39351453/

相关文章:

C - 如何检查用户是否已将文本文件发送到标准输入

perl - 为什么Programming Perl中 "7.2.39 IPC::Open2"所示的程序居然结束了?

java FileNotFoundException 打开的文件太多

c - 在c中写入文件,垃圾值被填充

types - 为什么 Rust 中没有任意大小的二进制整数类型?

input - 使用 scan!() 读取 u8 时为 "macro undefined"

Bash - stdir 单词到文件

c# - 如何在 C# 中将 System.IO.BinaryWriter 与模板/泛型类型的数组一起使用?

java - 为什么阻塞 IO API 在早期的 Java 中不是问题?

iterator - 如果另一个特征是否实现,函数如何有条件地回退到特征?