
Вот как вы можете построить свой собственный анализатор Markdown: Часть 2 - Как прочитать файл из командной строки
3 августа 2025 г.В этом посте мы будем реализовать интерфейс командной строки, который примет файл разметки в качестве аргумента командной строки, прочитать его контент и распечатать весь содержимое файла в терминале.
После этого мы будем на своем пути, чтобы начать внедрять анализ базовых текстов, заголовков, списков и так далее.
Я подробно объясню весь код, и, в конце концов, я дам вам весь код, чтобы вы могли попробовать без каких -либо проблем.
Требуемые модули
Есть два модуля, которые нам нужно использовать:
std::env
- Нам нужноenv
Модуль для взаимодействия с средой, в которой в настоящее время работает программа. Теперь мы используем его здесь для доступа к аргументам командной строки, передаваемых нашей программе.std::fs
- Нам нужноfs
Для операций файлов, таких как чтение и написание в файлы.Используйте std :: env; Используйте std :: fs;
Получение файла разметки из командной строки.
После получения необходимых модулей мы можем начать работать над получением файла разметки из аргумента командной строки. С этого момента мы будем писать каждую строку кода внутри основной функции.
let args: Vec<String> = env::args().collect();
Давайте поймем, что делает эта линия.
env::args()
- Эта функция возвращает итератор аргументов, представленных в командной строке в программу.collect()
- Затем мы используем метод collect () для употребления итератора и собирать все элементы из этого итератора в коллекцию.Vec<String>
- Чтобы хранить все предметы из итератора, мы используем векторную коллекцию, которая хранит элементы типаString
Полем Мы дали имя переменной этогоVec<String>
какargs
Полем Итак, этоargs
удерживает все элементы из итератора этой командной строки.
Теперь давайте рассмотрим случай, когда пользователь сознательно или неосознанно пропускает, давая файл разметки в аргументе командной строки. В этом случае нам нужно попросить пользователя предоставить файл разметки.
if args.len() < 2 {
println!("Please provide a markdown file");
return;
}
Здесь мы говорим, что если количество команд меньше 2, то распечатайте оператор с просьбой предоставить пользователя файл разметки, а затем вернуться из программы.
[! Примечание] Количество аргументов в командной строке, первый аргумент - это имя программы. Нам нужен еще один аргумент, который будет представлять имя файла. Следовательно, нам нужна длина
args
быть не менее 2.
Чтение файла и печать его контента.
Теперь давайте сохраним имя файла, которое мы получили из аргумента командной строки.
let filename = &args[1];
Мы создаем переменнуюfilename
и хранение имени файла в 2-й командной строке аргумента.
Теперь давайте начнем читать необработанное содержание файла и распечатать весь контент как есть.
println!("Attempting to read file: {}", filename);
let content = fs::read_to_string(filename).expect("Something went wrong reading the file");
println!("File content:\n{}", content);
- Во -первых, мы просто печатаем оператор журнала, чтобы узнать, что мы пытаемся прочитать файл.
fs::read_to_string(filename)
- Эта функция происходит отfs
модуль, который считывает весь содержимое файла, указанное именем файла.- Затем мы храним весь контент в
content
переменная и, наконец, распечатать весь контент на консоли.
Прежде чем объяснитьexpect()
Метод, давайте поймем конкретный тип данных в ржавчине.
Result
в ржавчине
В ржавчине способ справляться с операциями, которые могут потерпеть неудачу, - это использованиеResult
тип. Это перечисление с двумя вариантами:
enum Result<T, E> {
Ok(T), // Success - contains the value of type T
Err(E), // Error - contains the error of type E
}
Теперь давайте вернемся кfs::read_to_string()
функция Если вы посмотрите в документы, он возвращаетResult
тип и для успеха, он возвращаетString
тип, и для случая сбоя, он возвращаетstd::io::Error
тип.
Теперь давайте подключим это сexpect()
метод
Этотexpect()
Метод - это ярлык, который говорит:
- если
fs::read_to_string()
работает нормально и возвращаетсяOk(string)
, затем верните значение строки. - если
fs::read_to_string()
Не работает, затем сбой программы с помощью пользовательского сообщения об ошибке («что -то пошло не так, читая файл»).
Тестирование программы
Чтобы проверить, давайте создадимtest.md
Файл в корне проекта и поместите немного текста случайной отметки.
# this is a header
- this is a list
this is a normal text
Теперь откройте свой терминал из вашего каталога проекта и введите команду:
cargo run -- test.md
Он скомпилирует и выполнит код и даст вам следующий вывод.
Этот вывод показывает, что мы можем успешно получить содержимое файла Markdown и распечатать его необработанные данные. В следующем посте мы начнем узнавать о анализе.
Полный исходный код
use std::env;
use std::fs;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
println!("Please provide a markdown file");
return;
}
let filename = &args[1];
println!("Attempting to read file: {}", filename);
let content = fs::read_to_string(filename).expect("Something went wrong reading the file");
println!("File content:\n{}", content);
}
Заключение
В этом посте мы поняли, как взаимодействовать с командной строкой, а также прочитать файл Markdown из аргумента командной строки. Мы также поняли базовую обработку ошибок, используяResult
Где мы знаем, что все может пойти не так, и мы позаботились о том, чтобы наша программа смогла справиться с этим.
Теперь мы понимаем, что чтение и печать всего содержимого файла Markdown. Из следующего поста мы постепенно собираемся реализовать наш алгоритм анализа по шагам и охватывать базовый текст, заголовки, списки и другие вещи один за другим. Я очень рад следующему посту; Надеюсь, ты тоже взволнован. До скорой встречи.
Оригинал