关闭stdout或stdin

use*_*968 7 rust

由于被丢弃的时候,但文件和流的自动关闭io::stdin()仅提供操作底层的流,我看不出明确地关闭stdinstdout或检测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

Vla*_*eev 3

不久前,有一个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 问题的功能。