Will io::stdin().read_line ever fail?

Consider the following echo example

use std::io;

fn main() {
    let mut input = String::new();

    while io::stdin().read_line(&mut input).is_ok() {
        println!("{:?}", input);
        input.clear();
    }

    println!("How could I reach here?");
}

When I input an arbitrary string, the program echoes it back; when I send EOF with Ctrl+D, it prints an empty string; when I send SIGINT with Ctrl+C, it simply exits. As a user, (how) can I make io::stdin().read_line return an Err?

Probably the most common will be passing binary data (String expects valid UTF-8 stream), e.g. this will fail:

cargo run < /dev/urandom

See std::io::BufRead - Rust .

BTW you should also check Ok(usize) which is the number of bytes read. If it's 0/empty, the input has been closed and no more data will be read, see std::io::BufRead - Rust .

3 Likes

Another interesting example:

cargo run 0</tmp

I found it here. Curiously, the first suggestion from that page (0<&-) doesn't actually produce an error on my system.

2 Likes

I mean, there's no guarantee that the stdin pipe exists at all.

4 Likes

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.