如何在Rust中读取用户输入?

Jim*_* Lu 43 io input rust

编者注:这个问题是指在Rust 1.0之前的Rust部分,但是一般概念在Rust 1.0中仍然有效.

我打算制作一个标记器.我需要阅读用户键入的每一行,并在用户按下后停止阅读ctrl- D.

我四处搜索,只在Rust IO上找到了一个甚至没有编译的例子.我查看了io模块的文档,发现该read_line()函数是ReaderUtil界面的一部分,但stdin()返回了一个Reader.

我想要的代码在C++中基本上如下所示

vector<string> readLines () {
    vector<string> allLines;
    string line;

    while (cin >> line) {
        allLines.push_back(line);
    }

    return allLines;
}
Run Code Online (Sandbox Code Playgroud)

rob*_*nst 143

Rust 1.x(参见文档):

use std::io;
use std::io::prelude::*;

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

Rust 0.10-0.12(见文档):

use std::io;

fn main() {
    for line in io::stdin().lines() {
        print!("{}", line.unwrap());
    }
}
Run Code Online (Sandbox Code Playgroud)

Rust 0.9(参见0.9文档):

use std::io;
use std::io::buffered::BufferedReader;

fn main() {
    let mut reader = BufferedReader::new(io::stdin());
    for line in reader.lines() {
        print(line);
    }
}
Run Code Online (Sandbox Code Playgroud)

锈0.8:

use std::io;

fn main() {
    let lines = io::stdin().read_lines();
    for line in lines.iter() {
        println(*line);
    }
}
Run Code Online (Sandbox Code Playgroud)

锈0.7:

use std::io;

fn main() {
    let lines = io::stdin().read_lines();
    for lines.iter().advance |line| {
        println(*line);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请参阅[Rust-dev中的Rust迭代器的未来](https://mail.mozilla.org/pipermail/rust-dev/2013-June/004364.html),讨论`for`循环如何变为将来更简单(基本上摆脱`.iter().advance`). (4认同)

gai*_*epr 13

截至2015年4月17日,来自mdcoxmozilla rust irc.

use std::io;

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

    loop {
        input.clear();
        stdin.read_line(input);
        println!("{}", input);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当我执行`stdin.read_line(input);`时,编译器警告我这行不被使用. (2认同)
  • @yagooar,它应该警告没有使用 *result*,而不是行。这意味着从 stdin 读取可能会导致错误,但您没有检查它。 (2认同)

Bil*_*ain 2

在 Rust 0.4 中,使用ReaderUtilTrait 来访问read_line函数。请注意,您需要显式地将值转换为特征类型,例如reader as io::ReaderUtil

fn main() {
    let mut allLines = ~[];
    let reader = io::stdin();

    while !reader.eof() {
            allLines.push((reader as io::ReaderUtil).read_line());
    }

    for allLines.each |line| {
            io::println(fmt!("%s", *line));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个答案早于 Rust 1.0。请参阅现代解决方案的其他答案。

  • @BeyondSora,如果您能接受下面得到更多支持的答案,以便它出现在顶部,那就太好了。 (8认同)