Lire un fichier
Maintenant, nous allons ajouter une fonctionnalité pour lire le fichier qui est renseigné dans l’argument chemin_fichier. D’abord, nous avons besoin d’un fichier d’exemple pour le tester : nous utiliserons un fichier avec une petite quantité de texte sur plusieurs lignes avec quelques mots répétés. L’encart 12-3 présente un poème en Anglais de Emily Dickinson qui fonctionnera bien pour ce test ! Créez un fichier poem.txt à la racine de votre projet, et saisissez ce 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!
Une fois ce texte enregistré, éditez le src/main.rs et ajoutez-y le code pour lire le fichier, comme indiqué dans l’encart 12-4.
use std::env;
use std::fs;
fn main() {
// -- partie masquée ici --
let args: Vec<String> = env::args().collect();
let recherche = &args[1];
let chemin_fichier = &args[2];
println!("On recherche : {recherche}");
println!("Dans le fichier : {chemin_fichier}");
let contenu = fs::read_to_string(chemin_fichier)
.expect("Aurait dû pouvoir lire le fichier");
println!("Dans le texte :\n{contenu}");
}
Premièrement, nous importons une partie significative de la bibliothèque standard avec une instruction use : nous avons besoin de std::fs pour manipuler les fichiers.
Dans le main, la nouvelle instruction fs::read_to_string prend le chemin_fichier, ouvre ce fichier, et retourne un Result<String> du contenu du fichier.
Après cela, nous ajoutons à nouveau une instruction println! qui affiche la valeur de contenu après la lecture de ce fichier, afin que nous puissions vérifier que ce programme fonctionne correctement.
Exécutons ce code avec n’importe quelle chaîne de caractères dans le premier argument de la ligne de commande (car nous n’avons pas encore implémenté la partie de recherche pour l’instant), ainsi que le fichier poem.txt en second argument :
$ 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`
On recherche : the
Dans le fichier : poem.txt
Dans le texte :
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!
Très bien ! Notre code a lu et a ensuite affiché le contenu du fichier. Mais le code a quelques défauts. En cet instant, la fonction main a plusieurs responsabilités : généralement, les fonctions sont plus claires et faciles à maintenir si chaque fonction est en charge d’une seule tâche. L’autre problème est que nous ne gérons pas les erreurs correctement. Le programme est encore très modeste, donc ces imperfections ne sont pas un gros problème, mais dès que le programme va grossir, il sera plus difficile de les corriger proprement. Le remaniement du code très tôt lors du développement d’un logiciel est une bonne pratique, car c’est beaucoup plus facile de remanier des petites portions de code. C’est ce que nous allons faire dès maintenant.