如何终止标准输入?

时间:2015-01-16 18:14:06

标签: windows stdin rust

在C ++中,我可以像这样读取stdin:

while (std::getline(std::cin, line))
    process(line);

当我进入Ctrl + Z(Windows)时,它终止标准输入,循环结束。我可以用其他语言做类似的事情。

我试图将这个成语翻译成Rust,我想出了这个:

use std::io;

fn main() {
    loop {
        match io::stdin().read_line() {
            Ok(line) => process(line),
            Err(_) => break,
        }
    }
}

fn process(x: String) {
    println!("{:?}", x.as_bytes());
}

但是,当我在运行此代码时执行Ctrl + Z时,它不会转到Err案例。它只是将该行处理为Ok。给出一个包含3个字符的字符串,SUB字符(0x1A),然后是CRLF("\r\n")。

那么,如何终止标准输入并导致read_line失败?或者更确切地说,我如何检测终止标准输入的请求?我可以检查SUB字符,但这不是可移植的,因为它在其他系统上是不同的字符(例如EOT)。

修改

github repo上有一个未解决的问题。 Issue #19914

1 个答案:

答案 0 :(得分:0)

我没有使用我的Windows VM进行测试,但它适用于OS X(使用 Ctrl - D )。这适用于您的情况:

use std::io::stdin;

fn process(a: &str) {}

fn main() {
    for line in stdin().lock().lines() {
        match line {
            Ok(line) => process(&*line),
            Err(e) => panic!("{}", e),
        }
    }
}