由于文件和流在被删除时会自动关闭,但是io::stdin()只为底层流提供句柄,因此我无法在程序中显式关闭stdin或stdout或检测stdin上的EOF。
考虑一下
fn main() {
let mut stdin = io::stdin();
let mut linebuffer = String::new();
loop {
match stdin.read_line(&mut linebuffer) {
Ok(i) if i == 0 => { break; },
Ok(i) => {
println!("{} {}", linebuffer, i);
},
Err(e) => { panic!(e); }
}
linebuffer.clear();
}
}检查放入缓冲区的字节数似乎不太好,因为管道可能会被写入零字节而被刷新。从封闭的stdin读取应该会导致IOError,但它不会。
与此相关:如何显式关闭我自己的stdout / stderr
发布于 2015-06-11 09:57:18
不久前,有一个ErrorKind::EndOfFile枚举变量,它是在源流关闭时在读取操作时发出的。它似乎没有进入新的I/O库实现,而是将Read特性更改为在EOF上返回0读字节。事实上,这就是I/O改革中的规定。因此,是的,检查零是检测当前锈蚀中流结束的有效方法。
顺便说一句,您可以编写Ok(0)而不是Ok(i) if i == 0。
match stdin.read_line(&mut buf) {
Ok(0) => break,
...
}至于如何关闭stdout()/stderr(),遗憾的是,当前的API似乎没有提供一种方法。它可能是一个值得RFC或至少一个RFC发行的特性。
https://stackoverflow.com/questions/30776520
复制相似问题