Читання файлу

Тепер додамо функціональність для читання файлу, заданого параметром file_path. Для початку нам знадобиться файл для тестування, і ми скористаємося файлом із невеликим текстом у кілька рядків із повторенням слів. Блок коду 12-3 містить вірш Емілі Дікінсон, що добре підійде для цього! Створіть файл poem.txt у кореневому рівні вашого проєкту, і введіть вірш "Я ніхто! А ти хто?"

Файл: poem.txt

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!

Listing 12-3: A poem by Emily Dickinson makes a good test case

Підготувавши текст, відредагуйте src/main.rs і додайте код для читання файлу, як вказано у Блоці коду 12-4.

Файл: src/main.rs

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:\n{contents}");
}

Блок коду 12-4: Читання вмісту файлу, вказаного другим параметром

Спершу, ми вводимо в область видимості відповідну частину стандартної бібліотеки за допомогою інструкції use: для обробки файлів потрібен std::fs.

У main нова інструкція fs::read_to_string бере file_path, відкриває цей файл і повертає std::io::Result<String> з його вмістом.

По тому знову додаємо тимчасову інструкцію println!, що видрукує значення contents після читання файлу, щоб ми змогли перевірити, як програма працює.

Запустімо цей код з будь-якою стрічкою першим параметром командного рядка (бо ми ще не додали частину для пошуку) і poem.txt другим параметром:

$ cargo run -- the poem.txt
   Compiling minigrep v0.1.0 (file:///projects/minigrep)
    Finished dev [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!

Чудово! Код прочитав і надрукував вміст файлу. Але код має кілька недоліків. Наразі функція main відповідає за багато різних речей. В цілому, функції стають зрозумілішими і їх легше підтримувати, якщо кожна функція відповідає за лише одну ідею. Інша проблема полягає в тому, що ми не обробляємо помилки так добре, як могли б. Програма все ще невелика, тому ці недоліки не становлять великої проблеми, але зі зростанням програми стане важчим їх акуратно виправити. Є гарна порада - починати рефакторити код на ранній стадії розробки програми, бо значно легше рефакторити невеликі фрагменти коду. Цим ми й займемося.