Lire un fichier
Nous allons maintenant ajouter la fonctionnalité de lecture du fichier spécifié dans l’argument file_path. Tout d’abord, nous avons besoin d’un fichier d’exemple pour le tester : nous utiliserons un fichier contenant une petite quantité de texte sur plusieurs lignes avec quelques mots répétés. L’encart 12-3 contient un poème d’Emily Dickinson qui conviendra parfaitement ! Créez un fichier appelé poem.txt à la racine de votre projet, et saisissez le poème “I’m Nobody! Who are you?”
I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us - don't tell!
They'd banish us, you know.
How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!
Avec le texte en place, modifiez src/main.rs et ajoutez du code pour lire le fichier, comme illustré dans l’encart 12-4.
use std::env;
use std::fs;
fn main() {
// --snip--
let args: Vec<String> = env::args().collect();
let query = &args[1];
let file_path = &args[2];
println!("Searching for {query}");
println!("In file {file_path}");
let contents = fs::read_to_string(file_path)
.expect("Should have been able to read the file");
println!("With text:
{contents}");
}
Tout d’abord, nous importons une partie pertinente de la bibliothèque standard avec une instruction use : nous avons besoin de std::fs pour manipuler les fichiers.
Dans main, la nouvelle instruction fs::read_to_string prend le file_path, ouvre ce fichier, et renvoie une valeur de type std::io::Result<String> qui contient le contenu du fichier.
Ensuite, nous ajoutons à nouveau une instruction println! temporaire qui affiche la valeur de contents après la lecture du fichier afin de vérifier que le programme fonctionne jusqu’ici.
Exécutons ce code avec n’importe quelle chaîne comme premier argument de ligne de commande (car nous n’avons pas encore implémenté la partie recherche) et le fichier poem.txt comme second argument : console {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/output.txt}}
$ cargo run -- the poem.txt
Compiling minigrep v0.1.0 (file:///projects/minigrep)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.0s
Running `target/debug/minigrep the poem.txt`
Searching for the
In file poem.txt
With text:
I'm nobody! Who are you?
Are you nobody, too?
Then there's a pair of us - don't tell!
They'd banish us, you know.
How dreary to be somebody!
How public, like a frog
To tell your name the livelong day
To an admiring bog!
Parfait ! Le code a lu puis affiché le contenu du fichier. Mais le code présente quelques défauts. Pour le moment, la fonction main à plusieurs responsabilités : en général, les fonctions sont plus claires et plus faciles à maintenir si chaque fonction n’est responsable que d’une seule chose. L’autre problème est que nous ne gérons pas les erreurs aussi bien que nous le pourrions. Le programme est encore petit, donc ces défauts ne constituent pas un gros problème, mais à mesure que le programme grandit, il sera plus difficile de les corriger proprement. C’est une bonne pratique de commencer le refactoring tôt lors du développement d’un programme, car il est beaucoup plus facile de remanier de petites quantités de code. C’est ce que nous ferons ensuite.