Rust: Reading and Writing Files

Reading and Writing Files

We need some way to actually get data from the filesystem so we can process it, and write it back when we're done

我们需要某种方法从文件系统中实际获取数据,以便处理它,并在完成后将其写回来

rust 复制代码
use std::fs;

std::fs::read_to_string returns a Result<String, std::io::Error>.

If the function succeeds, it produces a String. If it fails, it produces a std::io::Error, the standard library's type for representing I/O problems.

std::fs::read_to_string返回Result<String, std::io::Error>。

如果函数成功,它将生成一个String。如果失败,它会产生std::io::Error,这是表示I/O问题的标准库类型。

rust 复制代码
fn main() {
	let args = parse_args();
	let data = match fs::read_to_string(&args.filename) { Ok(v) => v,
	          Err(e) => {
	              eprintln!("{} failed to read from file '{}': {:?}",
	                        "Error:".red().bold(), args.filename, e);
	              std::process::exit(1);
	} };
	match fs::write(&args.output, &data) { Ok(_) => {},
	          Err(e) => {
	              eprintln!("{} failed to write to file '{}': {:?}",
	                  "Error:".red().bold(), args.filename, e);
	              std::process::exit(1);
	} };
}

Find and Replace

The final touch for this program is to implement its actual functionality: finding and replacing. For this, we'll use the regex crate, which compiles and executes regular expressions. It provides a struct called Regex, which represents a compiled regular expression. Regex has a method replace_all, which does exactly what it says: it searches a string for all matches of the regular expression and replaces each one with a given replacement string. We can pull this logic out into a function:

这个程序的最后一步是实现它的实际功能:查找和替换。为此,我们将使用regex crate,它编译并执行正则表达式。它提供了一个名为Regex的结构体,它表示编译后的正则表达式。Regex有一个方法replace_all,它所做的正是它所说的:它在字符串中搜索正则表达式的所有匹配项,并用给定的替换字符串替换每个匹配项。我们可以把这个逻辑放到一个函数中:

rust 复制代码
use regex::Regex;
fn replace(target: &str, replacement: &str, text: &str)
      -> Result<String, regex::Error>
  {
		let regex = Regex::new(target)?;
      	Ok(regex.replace_all(text, replacement).to_string())
  }
rust 复制代码
fn main() {
	let args = parse_args();
	let data = match fs::read_to_string(&args.filename) { Ok(v) => v,
	          Err(e) => {
	              eprintln!("{} failed to read from file '{}': {:?}",
	                  "Error:".red().bold(), args.filename, e);
	              std::process::exit(1);
	} };
	let replaced_data = match replace(&args.target, &args.replacement, &data) {
	          Ok(v) => v,
	          Err(e) => {
	              eprintln!("{} failed to replace text: {:?}",
	                  "Error:".red().bold(), e);
	              std::process::exit(1);
	          }
	};
	match fs::write(&args.output, &replaced_data) { Ok(v) => v,
	          Err(e) => {
	              eprintln!("{} failed to write to file '{}': {:?}",
	                  "Error:".red().bold(), args.filename, e);
	              std::process::exit(1);
	} };
}
rust 复制代码
$ echo "Hello, world" > test.txt
$ cargo run "world" "Rust" test.txt test-modified.txt
$ cat test-modified.txt 
Hello, Rust
相关推荐
计算机安禾1 天前
【数据库系统原理】第19篇:计算机存储层次结构与数据库文件的物理组织
数据库·oracle
JAVA面经实录9171 天前
操作系统面试题
java·服务器·数据库·计算机网络·面试
摇滚侠1 天前
mariadb-libs 被 mysql-community-libs-5.7.28-1.el7.x86_64 取代
数据库·mysql·mariadb
DIY源码阁1 天前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
专注搞钱1 天前
GPT-4o写设备Recipe:从3小时到10分钟
数据库·人工智能·gpt·半导体
东风破1371 天前
达梦数据库实战:备份恢复与数据迁移全攻略(实例初始化、服务注册、路径迁移)
数据库·chrome
SelectDB技术团队1 天前
2026 SelectDB AI 产品发布会:Agent Native 数据基础设施能力全景发布
数据库·人工智能·agent·apache doris·selectdb
爱吃羊的老虎1 天前
【数据库】模块一:数据库基础与关系代数
数据库
dishugj1 天前
iSCSI + Multipath + ASM:Oracle RAC 共享存储技术链详解
数据库·oracle
yoothey1 天前
MySQL事务机制解析 - 面试高分知识点
数据库·mysql·面试