fs::read_to_string în Rust

Citește tot conținutul unui fișier text într-un String, dintr-un singur apel.

Sintaxă
use std::fs;

pub fn read_to_string<P: AsRef<Path>>(path: P) -> io::Result<String>

Ce face fs::read_to_string

fs::read_to_string("note.txt") deschide fișierul, îl citește în întregime și îl închide. Returnează Ok(String) cu tot textul sau Err(io::Error) dacă fișierul nu există, nu ai permisiuni sau conținutul nu este UTF-8 valid.

Este cea mai simplă metodă pentru fișiere mici și medii (configurări, liste, CSV-uri). Textul rezultat se parcurge de obicei cu .lines(). Pentru fișiere foarte mari, pe care nu vrei să le ții în memorie, citește linie cu linie cu BufReader. Calea poate fi &str, String, Path sau PathBuf.

Parametri

Parametru Descriere
path Calea fișierului, relativă la directorul curent sau absolută.

Ce returnează

io::Result<String>: textul fișierului sau eroarea.

Exemple

Exemplul 1: Citire și prelucrare pe linii

Creăm întâi fișierul cu fs::write, apoi îl citim și calculăm media notelor.

use std::fs;
use std::io;

fn main() -> io::Result<()> {
    fs::write("note.txt", "Ana 10\nMihai 8\nIoana 9\n")?;

    let text = fs::read_to_string("note.txt")?;
    let mut suma = 0;
    let mut elevi = 0;
    for linie in text.lines() {
        if let Some((nume, nota)) = linie.split_once(' ') {
            println!("{nume}: {nota}");
            suma += nota.parse::<u32>().unwrap_or(0);
            elevi += 1;
        }
    }
    println!("media: {:.2}", suma as f64 / elevi as f64);
    Ok(())
}

Rezultat

Ana: 10
Mihai: 8
Ioana: 9
media: 9.00

Exemplul 2: Tratarea erorii

Fișierul nu există. Mesajul vine de la sistemul de operare, iar kind() spune tipul erorii.

use std::fs;

fn main() {
    match fs::read_to_string("lipsa.txt") {
        Ok(text) => println!("am citit {} caractere", text.chars().count()),
        Err(e) => println!("nu pot citi lipsa.txt: {e} (tip: {:?})", e.kind()),
    }
}

Rezultat

nu pot citi lipsa.txt: No such file or directory (os error 2) (tip: NotFound)

Greșeli frecvente

  • Citești un fișier binar (imagine, PDF) cu read_to_string: eroarea stream did not contain valid UTF-8. Folosește fs::read.
  • Folosești căi relative și rulezi programul din alt director: calea este relativă la directorul curent al procesului, nu la fișierul sursă.
  • Pe Windows, liniile se termină cu \r\n. lines() elimină și \r, dar split('\n') nu.

Comenzi înrudite

  • fs::write: Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.
  • fs::read: Citește tot conținutul unui fișier ca octeți (Vec<u8>), fără să ceară ca textul să fie UTF-8.
  • io::BufRead: Trait-ul cititorilor cu buffer: oferă citire pe linii (lines, read_line) pentru fișiere, stdin și octeți din memorie.
  • io::Error: Eroarea operațiilor de intrare/ieșire; kind() dă categoria (NotFound, PermissionDenied…), iar new() creează una proprie.
  • File: Un fișier deschis: File::open îl deschide pentru citire, File::create îl creează (sau golește) pentru scriere.