2015-05-12 18 views
9

Làm thế nào tôi có thể đọc một dòng từ stdin trong Rust? Tôi đang yêu cầu tương đương với fgets() trong C.Đọc một dòng từ stdin

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

Tôi đã đọc How to read user input in Rust?, nhưng nó hỏi làm thế nào để đọc nhiều dòng; Tôi chỉ muốn một dòng.

Tôi cũng đọc How do I read a single String from standard input?, nhưng tôi không chắc liệu nó có hoạt động như fgets() hoặc sscanf("%s",...) hay không.

Trả lời

16

Trong How to read user input in Rust?, bạn có thể xem làm thế nào để lặp qua tất cả các dòng:

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

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

Bạn cũng có thể tự lặp mà không có một cho vòng lặp:

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(); 
} 

Bạn không thể có được một lớp lót để làm những gì bạn muốn. Nhưng sau nhận được một dòng duy nhất (và chính là câu trả lời tương tự như trong 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(); 
} 

Bạn cũng có thể sử dụng text_io thùng cho đầu vào siêu đơn giản:

#[macro_use] extern crate text_io; 

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

Còn về [Stdin :: read_line] (http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html#method.read_line)? – Gerstmann

+0

@Gerstmann: chức năng đó khá kỳ lạ khi sử dụng theo ý kiến ​​của tôi. –

5

Nếu bạn thực sự muốn tương đương với fgets, sau đó @Gerstmann is right, bạn nên sử dụng Stdin::read_line. Phương pháp này chấp nhận bộ đệm mà bạn có nhiều quyền kiểm soát hơn để đặt chuỗi vào:

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) 
} 

Không giống như C, bạn không thể vô tình vượt quá bộ đệm; nó sẽ được tự động thay đổi kích cỡ nếu chuỗi đầu vào quá lớn.

answer from @oli_obk - ker là giải pháp thành ngữ mà bạn sẽ thấy hầu hết thời gian. Trong đó, chuỗi được quản lý cho bạn, và giao diện được sạch hơn nhiều.

Các vấn đề liên quan