io::stdin în Rust

Intrarea standard (tastatura): read_line citește o linie și o adaugă la un String, inclusiv caracterul de linie nouă.

Sintaxă
use std::io;

pub fn stdin() -> Stdin
fn read_line(&self, buf: &mut String) -> io::Result<usize>

Ce face io::stdin

io::stdin() returnează un Stdin, legătura programului cu intrarea standard: tastatura sau datele trimise prin | și < în terminal. Metoda read_line(&mut s) așteaptă o linie și o adaugă la sfârșitul lui s, cu tot cu \n final.

Valoarea returnată este numărul de octeți citiți; 0 înseamnă că intrarea s-a terminat (EOF). De aceea, înainte de parse, aproape întotdeauna scrii .trim(). Dacă refolosești același String într-o buclă, golește-l cu clear().

Parametri

Parametru Descriere
buf Textul la care se adaugă linia citită (la read_line).

Ce returnează

stdin: un Stdin. read_line: io::Result<usize>, numărul de octeți citiți.

Exemple

Exemplul 1: Citirea numelui și a vârstei

trim() elimină \n-ul de la final. Fără el, parse ar eșua.

use std::io;

fn main() -> io::Result<()> {
    let mut nume = String::new();
    println!("Cum te numești?");
    io::stdin().read_line(&mut nume)?;

    let mut text_varsta = String::new();
    println!("Câți ani ai?");
    io::stdin().read_line(&mut text_varsta)?;

    let varsta: u32 = text_varsta.trim().parse().unwrap_or(0);
    println!("Salut, {}! Peste 10 ani vei avea {} ani.", nume.trim(), varsta + 10);
    println!("linia citită era {:?}", nume);
    Ok(())
}

Ce scrie utilizatorul (intrare)

Ana
25

Rezultat

Cum te numești?
Câți ani ai?
Salut, Ana! Peste 10 ani vei avea 35 ani.
linia citită era "Ana\n"

Exemplul 2: Citire până la sfârșitul intrării

Bucla se oprește când read_line returnează 0. clear() golește textul între citiri.

use std::io;

fn main() -> io::Result<()> {
    let mut linie = String::new();
    let mut total = 0.0;
    loop {
        linie.clear();
        if io::stdin().read_line(&mut linie)? == 0 {
            break;
        }
        match linie.trim().parse::<f64>() {
            Ok(suma) => total += suma,
            Err(_) => println!("ignor linia {:?}", linie.trim()),
        }
    }
    println!("total cheltuieli: {total:.2} lei");
    Ok(())
}

Ce scrie utilizatorul (intrare)

120
35.5
abc
44.5

Rezultat

ignor linia "abc"
total cheltuieli: 200.00 lei

Greșeli frecvente

  • Uiți trim(): "25\n".parse::<u32>() dă eroarea invalid digit found in string.
  • Refolosești același String fără clear(): read_line adaugă la final, deci textul crește cu fiecare linie.
  • Afișezi o întrebare cu print! (fără linie nouă) și ea nu apare înainte de citire: ieșirea este scrisă pe linii. Apelează io::stdout().flush().

Comenzi înrudite

  • io::Stdin::lines: Parcurge intrarea standard linie cu linie, ca iterator de String-uri fără caracterul de linie nouă.
  • io::stdout: Ieșirea standard ca obiect Write: permite flush(), write! și scriere rapidă prin lock().
  • io::BufRead: Trait-ul cititorilor cu buffer: oferă citire pe linii (lines, read_line) pentru fișiere, stdin și octeți din memorie.
  • ParseIntError: Eroarea returnată când un text nu poate fi transformat în număr întreg; kind() spune motivul exact.