io::Stdin::lines în Rust

Parcurge intrarea standard linie cu linie, ca iterator de String-uri fără caracterul de linie nouă.

Sintaxă
fn lines(self) -> Lines<StdinLock<'static>>
// Iterator<Item = io::Result<String>>

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 încerci read_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().