Rust 文件读取:实现我们的 “迷你 grep”

devtools/2025/2/12 19:45:12/

1. 准备示例文件

首先,在项目根目录(与 Cargo.toml 同级)下新建一个名为 poem.txt 的文件。示例内容可参考 Emily Dickinson 的诗:

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.

这为我们后续的搜索及测试提供了多行文本。

2. 在 src/main.rs 中读入文件

让我们打开 src/main.rs,在前面已经实现的“获取命令行参数”逻辑后,添加读取文件内容的功能。完整示例如下:

rust">use std::env;
use std::fs;fn main() {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!("File contents:\n{contents}");
}

代码解读

  1. use std::fs;

    • 我们从标准库引入了 fs 模块来完成文件操作。
  2. fs::read_to_string(file_path)

    • 该函数以只读方式打开指定文件并读取其完整内容。它返回一个 Result<String>,如果读取成功即包含文本内容,否则包含错误信息。
  3. expect("...")

    • 简化的错误处理方式。如果无法读取文件,程序会在此处退出并打印自定义错误信息。
  4. println!("File contents:\n{contents}")

    • 打印出文件全部内容,以便确认我们成功地读取到文件。

3. 运行示例

我们假设要在文件中搜索“searchstring”(功能尚未实现,但先用它做参数示例):

$ cargo run -- searchstring poem.txtCompiling minigrep v0.1.0 (~/minigrep)Finished dev [unoptimized + debuginfo] target(s) in 0.74sRunning `target/debug/minigrep searchstring poem.txt`
Searching for: searchstring
In file: poem.txt
File contents:
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.

如输出所示,minigrep 成功打印了 poem.txt 的全部文本。

4. 潜在问题及后续改进

当前代码虽能正常运行,但仍有一些可优化之处:

  1. main 函数职责过多

    • main 同时负责解析参数、读取文件、打印内容,如果将来添加更多功能,会越来越臃肿。
    • 我们可以将配置解析与文件搜索等操作拆分到单独的函数或模块。
  2. 错误处理不够灵活

    • 这里我们使用 expect 简化了错误处理,一旦出错程序就立刻崩溃。
    • 若是生产环境,可考虑返回 Result 并进行更完善的错误提示与恢复机制。
  3. 搜索功能尚未实现

    • 虽然可以成功读取文件,但还无法对文件内容进行关键字查找。
    • 后续我们会在搜索逻辑、大小写处理、行输出等方面展开更多讨论。

为什么要及早重构

即使代码规模目前很小,也最好在开发早期就抽离出清晰的模块或函数,避免随着功能增多而难以维护。Rust 重视“让正确的事情更简单、错误的事情更困难”,在我们添加更多功能前,先把当前结构打好基础会有助于长期维护与扩展。

5. 总结

本篇内容主要实现了:

  • 如何使用 std::fs::read_to_string 读取文件内容;
  • 如何在命令行工具中打印所读取的文本结果;

后面,我们会重点将“搜索”功能添加到 minigrep,并改善程序结构和错误处理,让它成为一个小而完整的文本搜索器。希望你已对 Rust 的文件 IO 操作有了直观理解,欢迎继续关注后续改进!


http://www.ppmy.cn/devtools/158296.html

相关文章

请解释 JavaScript 中的函数式编程,优缺点是什么?

一、对JavaScript函数式编程的理解 函数式编程&#xff08;Functional Programming&#xff0c;FP&#xff09;是一种编程范式&#xff0c;它将计算视为数学函数的求值&#xff0c;并避免改变状态和可变数据。 在JavaScript中&#xff0c;函数式编程具有以下几个关键特性&…

使用epoll与sqlite3进行注册登录

将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确 额外功能&…

fastadmin图片前台导出

参考 https://github.com/hhurz/tableExport.jquery.plugin#options define([jquery, bootstrap, backend, table, form], function ($, undefined, Backend, Table, Form) {$(document).ready(function(){$(#table).bootstrapTable(refreshOptions, {exportOptions: {onMsoNu…

体验 DeepSeek-R1:解密 1.5B、7B、8B 版本的强大性能与应用

文章目录 &#x1f34b;引言&#x1f34b;DeepSeek 模型简介&#x1f34b;版本更新&#xff1a;1.5B、7B、8B 的区别与特点&#x1f34b;模型评估&#x1f34b;体验 DeepSeek 的过程&#x1f34b;总结 &#x1f34b;引言 随着大规模语言模型的持续发展&#xff0c;许多模型在性…

Node.js 实现简单爬虫

介绍 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 本文将使用 Nodejs 编写一个简单的爬虫脚本&#xff0c;爬取一个美食网站&#xff0c;获取菜品的标题和图片链接&#xff0c;并以表格的形式输出。 准备工作 1、初始化项目 首先&#xff0…

ESP8266配置为TCP客户端,连接电脑和手机(使用Arduino配置)

一、简介 基于 ESP8266 的 Arduino 代码&#xff0c;其主要功能是将 ESP8266 连接到指定的 Wi-Fi 网络&#xff0c;并与指定 IP 地址和端口号的服务器建立 TCP 连接。在连接成功后&#xff0c;实现了串口和网络数据的双向传输&#xff0c;也就是将从串口接收到的数据通过 Wi-Fi…

(篇五)基于PyDracula搭建一个深度学习的软件之融入大华相机

1大华python文件解读 我们正常打开MVviewer会发现这些文件。我的应用场景是PLC给我一个信号&#xff0c;我就触发拍照程序&#xff0c;那么我需要选取哪一个文件作为研究基础呢&#xff1f; 1.1 异步回调byCallBack和手动轮询byGetFrame 异步回调 采用 异步回调 (attachGr…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题&#xff1a;回车换行是什么&#xff0c;或者说回车和换行是同一个概念吗&#xff1f;   可能大家对回车换行有一定的误解&#xff0…