如何从标准输入读取一行?

时间:2015-05-12 08:51:39

标签: rust

我在C中要求相当于fgets()

let line = ...;
println!("You entered: {}", line);

我已阅读How to read user input in Rust?,但它询问如何阅读多行;我只想要一条线。

我还阅读How do I read a single String from standard input?,但我不确定它是否与fgets()sscanf("%s",...)相符。

4 个答案:

答案 0 :(得分:31)

How to read user input in Rust?中,您可以看到如何遍历所有行:

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        println!("{}", line.unwrap());
    }
}

您也可以在没有for循环的情况下手动迭代:

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut iterator = stdin.lock().lines();
    let line1 = iterator.next().unwrap().unwrap();
    let line2 = iterator.next().unwrap().unwrap();
}

你不能写一个单行来做你想做的事。但是以下内容读取一行(与How do I read a single String from standard input?中的答案完全相同):

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let line1 = stdin.lock().lines().next().unwrap().unwrap();
}

您还可以使用text_io包进行超级简单输入:

#[macro_use] extern crate text_io;

fn main() {
    // reads until a \n is encountered
    let line: String = read!("{}\n");
}

答案 1 :(得分:7)

如果您确实希望等效于fgets,然后@Gerstmann is right,则应使用Stdin::read_line。此方法接受一个缓冲区,您可以更好地控制该字符串:

use std::io::{self, BufRead};

fn main() {
    let mut line = String::new();
    let stdin = io::stdin();
    stdin.lock().read_line(&mut line).unwrap();
    println!("{}", line)
}

与C不同,您不会意外地超出缓冲区;如果输入字符串太大,它将自动调整大小。

answer from @oli_obk - ker是您大部分时间都会看到的惯用解决方案。在其中,字符串是为您管理的,界面更清晰。

答案 2 :(得分:1)

stdin中读取一行:
std::io::stdin().read_line(&mut line)?;

使用隐式同步:

use std::io;
fn main() -> io::Result<()> {
    let mut line = String::new();
    io::stdin().read_line(&mut line)?;

    println!("You entered: {}", line);
    Ok(())
}

使用显式同步:

use std::io::{self, BufRead};

fn main() -> io::Result<()> {
    let stdin = io::stdin();
    let mut handle = stdin.lock();

    let mut line = String::new();
    handle.read_line(&mut line)?;

    println!("You entered: {}", line);
    Ok(())
}

如果您对字节数感兴趣,例如n,使用:
let n = handle.read_line(&mut line)?;

let n = io::stdin().read_line(&mut line)?;

尝试一下:

use std::io;
fn main() -> io::Result<()> {
    let mut line = String::new();
    let n = io::stdin().read_line(&mut line)?;

    println!("{} bytes read", n);
    println!("You entered: {}", line);
    Ok(())
}

请参见doc

答案 3 :(得分:0)

如果你想在某个时候离开 for循环

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    for line in stdin.lock().lines() {
        match line {
            Err(_) => break,    // with ^Z
            Ok(s) => println!("{}", s),
        }

    }
    println!("fin");
}