Voglio leggere un file e recuperare un vettore di String
s. La seguente funzione funziona, ma esiste un modo più conciso o idiomatico?Leggere un file e ottenere una serie di stringhe
use std::fs::File;
use std::io::Read;
fn lines_from_file(filename: &str) -> Vec<String> {
let mut file = match File::open(filename) {
Ok(file) => file,
Err(_) => panic!("no such file"),
};
let mut file_contents = String::new();
file.read_to_string(&mut file_contents)
.ok()
.expect("failed to read!");
let lines: Vec<String> = file_contents.split("\n")
.map(|s: &str| s.to_string())
.collect();
lines
}
Alcune cose che sembrano non ottimale per me:
- Due controlli di errore separati per la lettura del file.
- Lettura dell'intero file a
String
, che verrà gettato via. Ciò sarebbe particolarmente dispendioso se volessi solo le prime linee N. - Fare un
&str
per riga, che verrà gettato via, invece di andare direttamente dal file a un numeroString
per riga.
Come può essere migliorato?
usare 'linee()' iteratore: http://doc.rust-lang.org/std/io/trait.BufRead.html#method.lines – BurntSushi5
non capisco il motivo per cui questa domanda è stata downvoted. Se è considerato troppo soggettivo, propongo di rimuovere il tag 'idiomatic', poiché descrive esattamente il tipo di cosa che sto chiedendo. –