2015-05-12 14 views

Odpowiedz

16

W How to read user input in Rust? można zobaczyć, w jaki sposób iteracyjne nad wszystkie linie:

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

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

Można również ręcznie iteracyjne bez pętli 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(); 
} 

Nie można uzyskać jedną wykładziny rób co chcesz. Ale dodaje pobiera jeden wiersz (i jest dokładnie taka sama odpowiedź jak w 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(); 
} 

Można również użyć text_io paka dla bardzo prostego wejścia:

#[macro_use] extern crate text_io; 

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

Co z [Stdin :: read_line] (http://doc.rust-lang.org/nightly/std/io/struct.Stdin.html#method.read_line)? – Gerstmann

+0

@Gerstmann: ta funkcja jest raczej dziwna w mojej opinii. –

5

Jeśli naprawdę chcesz uzyskać odpowiednik fgets, następnie @Gerstmann is right, powinieneś użyć Stdin::read_line. Metoda ta przyjmuje bufor, że masz większą kontrolę, aby umieścić ciąg do:

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

przeciwieństwie do C, nie można przypadkowo przepełnienia bufora; zostanie on automatycznie zmieniony, jeśli ciąg wejściowy jest za duży.

answer from @oli_obk - ker to rozwiązanie idiomatyczne, które można zobaczyć przez większość czasu. W nim łańcuch jest zarządzany dla Ciebie, a interfejs jest znacznie czystszy.

Powiązane problemy