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ă eroareainvalid digit found in string. - Refolosești același
Stringfărăclear():read_lineadaugă 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.