是否可以在不逐行缓存输入的情况下从 `io::stdin()` 中读取字符?

kir*_*hik 3 string stdin rust

这个问题指的是稳定的 Rust 版本1.2.0

我只想遍历 CLI 应用程序标准输入中的字符。完全有可能将 readstdinread_line方法放入一个临时String实例中,然后迭代它的chars()迭代器。

但我不喜欢这种方法,因为它分配了一个完全不必要的String对象。Stdintrait 的文档实现了Readtrait,它有 chars()迭代器,但它被标记为不稳定(因此不能与稳定的编译器版本一起使用)。

是否有另一种可能不太明显的方式来逐个字符地读取 stdin,而无需任何额外的 Rust 端缓冲?

XAM*_*cky 5

您可以通过拥有一个单字节数组来实现这一点,并继续读取直到Result变成Err. 但是,这存在一个问题,因为如果您不以 ASCII 字符读取,则可能会出现这种情况。如果您要解决这个问题,最好只分配 aString并使用chars迭代器,因为它可以处理这个问题。

示例代码:

use std::io::{stdin, Read};

fn main() {
    loop {
        let mut character = [0];
        while let Ok(_) = stdin().read(&mut character) {
            println!("CHAR {:?}", character[0] as char);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

Hello World
CHAR Some('H')
CHAR Some('e')
CHAR Some('l')
CHAR Some('l')
CHAR Some('o')
CHAR Some(' ')
CHAR Some('W')
CHAR Some('o')
CHAR Some('r')
CHAR Some('l')
CHAR Some('d')
CHAR Some('\n')
????
CHAR Some('\u{e4}')
CHAR Some('\u{bd}')
CHAR Some('\u{a0}')
CHAR Some('\u{e5}')
CHAR Some('\u{a5}')
CHAR Some('\u{bd}')
CHAR Some('\u{e4}')
CHAR Some('\u{b8}')
CHAR Some('\u{96}')
CHAR Some('\u{e7}')
CHAR Some('\u{95}')
CHAR Some('\u{8c}')
CHAR Some('\n')
Run Code Online (Sandbox Code Playgroud)