在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
答案 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),
}
}
}