2014-09-02 77 views
1

我最近学会了如何使用io从防火墙文档读取输入,但我想知道是否有任何'简单'方法读取控制台输入。我的根源深深植入C++,所以从控制台获取输入就像std::cin >> var一样简单。但锈我做:一次从控制台读取用户输入一次

for line in io::stdin().lines() { 
    print!("{}", line.unwrap()); 
    break; 
} 

这种读取输入一次,但for循环看起来像一个非常笨拙的方式来做到这一点。我怎样才能轻松做到这一点?

回答

4

io::stdin()实际上是一个BufferedReader<>包装stdin。如您所见,in the docsBufferedReader提供了很多提取内容的方法。

你必须值得注意的是:

fn read_line(&mut self) -> IoResult<String> 

将尝试读取从标准输入线(也可能返回一个错误)。一个简单的代码来读取int从标准输入将是:

let a: int = from_str(io::stdin().read_line().unwrap().as_slice()).unwrap() 

但它没有任何错误处理,并可以很容易失败。

更明确的办法将要求您更清洁处理事情:

let a: int = match from_str(
    match io::stdin().read_line() { 
     Ok(txt) => txt, // Return the slice from_str(...) expects 
     Err(e) => { /* there was an I/O Error, details are in e */ } 
    }.as_slice()) /* match from_str(...) */ { 
     Some(i) => i, // return the int to be stored in a 
     None => { /* user input could not be parsed as an int */ } 
    }; 
+0

Rust告诉我'txt'不够长,无法在第二次执行的下一个块中匹配,我怎么能通过? – 2014-09-03 20:18:19

+0

没关系固定,as_slice()必须移动到第一个匹配语句的末尾 – 2014-09-03 20:28:10

+0

@SyntacticFructose哦,是的,的确,好抓!我会纠正它。 – Levans 2014-09-03 20:46:08

4

std::io::stdin()返回BufferedReader<StdReader>BufferedReader实现Buffer性状。这意味着,你可以调用它read_line()方法:

match io::stdin().read_line() { 
    Ok(line) => // do whatever you want, line is String 
    Err(e) => // handle error, e is IoError 
} 

如果你想读几行,它可能是更好的io::stdin()结果保存到一个变量第一。

+0

目前,在* read_line *功能需要一个参数,一个可变引用到*字符串*。欲了解更多信息,请点击[这里](https://doc.rust-lang.org/std/io/struct.Stdin.html#method.read_line)。 – freinn 2017-02-27 19:17:33

相关问题