Чтение файла

RustRustBeginner

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Добро пожаловать в Чтение файла. Эта лабораторная работа является частью Rust Book. Вы можете практиковать свои навыки Rust в LabEx.

В этой лабораторной работе мы добавляем функциональность для чтения файла, указанного в аргументе file_path, с использованием метода fs::read_to_string, а затем выводим содержимое файла.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-100419{{"Чтение файла"}} rust/string_type -.-> lab-100419{{"Чтение файла"}} rust/function_syntax -.-> lab-100419{{"Чтение файла"}} rust/expressions_statements -.-> lab-100419{{"Чтение файла"}} rust/method_syntax -.-> lab-100419{{"Чтение файла"}} end

Чтение файла

Теперь мы добавим функциональность для чтения файла, указанного в аргументе file_path. Во - первых, нам нужен пример файла для тестирования: мы будем использовать файл с небольшим количеством текста на нескольких строках с некоторыми повторяющимися словами. В Listing 12-3 представлен стихотворение Эмили Диккенсон, которое подойдет отлично! Создайте файл с именем poem.txt в корневой директории вашего проекта и введите стихотворение "I'm Nobody! Who are you?".

Имя файла: 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: Стихотворение Эмили Диккенсон делает хороший тестовый случай.

После того, как текст就位, отредактируйте src/main.rs и добавьте код для чтения файла, как показано в Listing 12-4.

Имя файла: src/main.rs

use std::env;
1 use std::fs;

fn main() {
    --snip--
    println!("In file {}", file_path);

  2 let contents = fs::read_to_string(file_path)
       .expect("Should have been able to read the file");

  3 println!("With text:\n{contents}");
}

Listing 12-4: Чтение содержимого файла, указанного вторым аргументом

Во - первых, мы подключаем соответствующую часть стандартной библиотеки с помощью инструкции use: нам нужно std::fs для работы с файлами [1].

В main, новая инструкция fs::read_to_string принимает file_path, открывает этот файл и возвращает std::io::Result<String> содержимого файла [2].

После этого мы снова добавляем временную инструкцию println!, которая выводит значение contents после чтения файла, чтобы проверить, работает ли программа до сих пор [3].

Запустим этот код с любым строковым аргументом в качестве первого аргумента командной строки (потому что мы еще не реализовали часть поиска) и файлом 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 имеет несколько обязанностей: как правило, функции проще понять и легче поддерживать, если каждая функция отвечает только за одну идею. Другая проблема заключается в том, что мы не обрабатываем ошибки как следует. Программа еще небольшая, поэтому эти недостатки не представляют большой проблемы, но по мере роста программы будет труднее исправить их корректно. Хорошим практикой является раннее начало рефакторинга при разработке программы, потому что гораздо проще рефакторить меньшие объемы кода. Мы это сделаем далее.

Резюме

Поздравляем! Вы завершили лабораторную работу по чтению файла. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.