io::stdout în Rust

Ieșirea standard ca obiect Write: permite flush(), write! și scriere rapidă prin lock().

Sintaxă
pub fn stdout() -> Stdout
// Stdout: Write; .lock() -> StdoutLock

Ce face io::stdout

println! scrie deja în ieșirea standard. io::stdout() îți dă acces direct la ea, ca obiect care implementează Write: poți folosi write!/writeln!, write_all și mai ales flush().

Ieșirea standard este scrisă pe linii: textul fără \n (de la print!) poate rămâne în memorie. io::stdout().flush() îl trimite imediat, ceea ce e necesar când afișezi o întrebare pe aceeași linie cu răspunsul.

io::stdout().lock() blochează ieșirea pentru firul curent și dă un StdoutLock; dacă scrii mii de linii, e mult mai rapid decât println! repetat, care face lock la fiecare apel. Pentru erori există io::stderr().

Ce returnează

Un Stdout.

Exemple

Exemplul 1: Întrebare pe aceeași linie cu răspunsul

Fără flush(), textul „Oraș: ” ar putea apărea abia după ce utilizatorul a scris răspunsul.

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

fn main() -> io::Result<()> {
    print!("Oraș: ");
    io::stdout().flush()?;

    let mut oras = String::new();
    io::stdin().read_line(&mut oras)?;
    println!();
    println!("Livrăm în {}.", oras.trim());
    Ok(())
}

Ce scrie utilizatorul (intrare)

Brașov

Rezultat

Oraș: 
Livrăm în Brașov.

Exemplul 2: Scriere rapidă prin lock

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

fn main() -> io::Result<()> {
    let mut iesire = io::stdout().lock();
    writeln!(iesire, "Tabla înmulțirii cu 7:")?;
    for i in 1..=5 {
        writeln!(iesire, "7 x {i} = {}", 7 * i)?;
    }
    iesire.write_all(b"gata\n")?;
    Ok(())
}

Rezultat

Tabla înmulțirii cu 7:
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
gata

Greșeli frecvente

  • Uiți use std::io::Write: metoda flush nu este găsită.
  • Afișezi mesajele de eroare tot pe stdout: dacă cineva redirecționează ieșirea într-un fișier, nu mai vede erorile. Folosește eprintln! sau io::stderr().

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::Write: Trait-ul oricărei destinații de octeți: write_all scrie tot bufferul, flush golește memoria tampon; permite write!.
  • io::BufWriter: Adaugă un buffer peste orice scriitor: strânge scrierile mici și le trimite în bucăți mari, mult mai rapid.