由于被丢弃的时候,但文件和流的自动关闭io::stdin()仅提供操作底层的流,我看不出明确地关闭stdin或stdout或检测EOF就stdin在我的计划.
考虑
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();
}
}
Run Code Online (Sandbox Code Playgroud)
检查放入缓冲区的字节数似乎是不稳定的,因为管道可能会被写入其中的零字节刷新.从封闭中读取stdin应该导致IOError,但事实并非如此.
与此有点相关:如何明确关闭我自己stdout/ stderr?
不久前,有一个ErrorKind::EndOfFile枚举变体,当源流关闭时,它会在读取操作时发出。似乎它没有达到新的 I/O 库实现,而是将Read特征更改为在 EOF 时返回 0 读取字节。事实上,I/O 改革 RFC 中对此进行了指定。所以,是的,检查零是检测当前 Rust 中流结束的有效方法。
顺便说一下,你可以Ok(0)这样写Ok(i) if i == 0:
match stdin.read_line(&mut buf) {
Ok(0) => break,
...
}
Run Code Online (Sandbox Code Playgroud)
至于如何关闭stdout()/ stderr(),不幸的是,当前的 API 似乎没有提供方法。它可能是一个值得 RFC 或至少值得 RFC 问题的功能。
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |