Con Rust relativamente nuovo, ho visto troppi modi di leggere e scrivere file. Molti sono frammenti estremamente disordinati che qualcuno ha inventato per il loro blog e il 99% degli esempi che ho trovato (anche su Stack Overflow) provengono da build instabili che non funzionano più. Ora che Rust è stabile, cos'è uno snippet semplice, leggibile e senza panico per leggere o scrivere file?
Questo è il più vicino che ho ottenuto a qualcosa che funziona in termini di lettura di un file di testo, ma non si sta ancora compilando anche se sono abbastanza sicuro di aver incluso tutto ciò che avrei dovuto. Questo si basa su uno snippet che ho trovato su Google+ in tutti i luoghi e l'unica cosa che ho cambiato è che il vecchio BufferedReader
ora è solo BufReader
:
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
fn main() {
let path = Path::new("./textfile");
let mut file = BufReader::new(File::open(&path));
for line in file.lines() {
println!("{}", line);
}
}
Il compilatore si lamenta:
error: the trait bound `std::result::Result<std::fs::File, std::io::Error>: std::io::Read` is not satisfied [--explain E0277]
--> src/main.rs:7:20
|>
7 |> let mut file = BufReader::new(File::open(&path));
|> ^^^^^^^^^^^^^^
note: required by `std::io::BufReader::new`
error: no method named `lines` found for type `std::io::BufReader<std::result::Result<std::fs::File, std::io::Error>>` in the current scope
--> src/main.rs:8:22
|>
8 |> for line in file.lines() {
|> ^^^^^
Per riassumere, quello che sto cercando è:
- concisione
- leggibilità
- copre tutti i possibili errori
- non fatevi prendere dal panico
std::io::Read
), notare che in Rust è necessario importare i tratti che si prevede di utilizzare esplicitamente ; quindi qui ti manca un use std::io::Read
(che potrebbe essere un use std::io::{Read,BufReader}
per fondere insieme i due usi)