Ce face io::Stdin::lines
io::stdin().lines() dă un iterator care citește câte o linie la fiecare pas, până la sfârșitul intrării. Fiecare element este un io::Result<String>, iar textul nu mai conține \n (nici \r\n).
Este felul cel mai scurt de a procesa toate liniile primite, de exemplu un fișier trimis prin program < date.txt. Metoda blochează intrarea standard pentru firul curent (face lock()), ceea ce o face și rapidă.
Ce returnează
Un iterator peste io::Result<String>.
Exemple
Exemplul 1: Suma numerelor de pe fiecare linie
use std::io;
fn main() -> io::Result<()> {
let mut suma = 0;
for linie in io::stdin().lines() {
let linie = linie?;
suma += linie.trim().parse::<i32>().unwrap_or(0);
}
println!("suma: {suma}");
Ok(())
}
Ce scrie utilizatorul (intrare)
10
20
5
Rezultat
suma: 35
Exemplul 2: Numărarea cuvintelor, cu collect
collect::<Result<Vec<_>, _>>() adună toate liniile sau oprește la prima eroare de citire.
use std::io;
fn main() -> io::Result<()> {
let linii: Vec<String> = io::stdin().lines().collect::<Result<_, _>>()?;
let cuvinte: usize = linii.iter().map(|l| l.split_whitespace().count()).sum();
let goale = linii.iter().filter(|l| l.trim().is_empty()).count();
println!("{} linii ({goale} goale), {cuvinte} cuvinte", linii.len());
Ok(())
}
Ce scrie utilizatorul (intrare)
Rust este rapid
și sigur
în Iași și Cluj
Rezultat
4 linii (1 goale), 9 cuvinte
Greșeli frecvente
- Apelezi
io::stdin().lines()și după aceea încerciread_line:lines()consumăStdin-ul și citește până la final. - Rulezi programul în terminal și „se blochează”: așteaptă intrarea. Termină intrarea cu Ctrl+D (Linux, macOS) sau Ctrl+Z și Enter (Windows).
Comenzi înrudite
io::stdin: Intrarea standard (tastatura): read_line citește o linie și o adaugă la un String, inclusiv caracterul de linie nouă.io::BufRead: Trait-ul cititorilor cu buffer: oferă citire pe linii (lines, read_line) pentru fișiere, stdin și octeți din memorie.io::stdout: Ieșirea standard ca obiect Write: permite flush(), write! și scriere rapidă prin lock().