一、Rust ?运算符
?运算符:传播错误的一种快捷方式。
-
如果Result是Ok:Ok中的值就是表达式的结果,然后继续执行程序。
-
如果Result是Err:Err就是整个函数的返回值,就像使用了return
?运算符只能用于返回Result的函数。
?运算符与main函数
-
main函数返回类型是:()
-
main函数的返回类型也可以是:Result<T,E>
-
Box是trait对象,简单理解:“任何可能的错误类型”
二、Rust读写txt文件
Rust可以对txt文件读、写、创建、添加、打开操作。
use std::fs::{self, OpenOptions};
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.append(true)
.open(filepath)?;
三、Rust实例测试
main.rs
use std::fs::{self, OpenOptions};
use std::io::{BufRead, BufReader, BufWriter, Write};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let filepath = "test1.txt";
let filepath2 = "test2.txt";
let str = read_file_string(filepath);
println!("{:#?}", str);
let vec = read_file_vec(filepath);
println!("{:#?}", vec);
read_file_buffer(filepath)?;
write_file_buffer(filepath2)?;
Ok(())
}
//将整个文件作为字符串读取
fn read_file_string(filepath: &str) -> Result<String, Box<dyn std::error::Error>> {
let data = fs::read_to_string(filepath)?;
Ok(data)
}
//将整个文件作为Vector读取
fn read_file_vec(filepath: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let data = fs::read(filepath)?;
Ok(data)
}
//BufReader按行读取
fn read_file_buffer(filepath: &str) -> Result<(), Box<dyn std::error::Error>> {
let file = OpenOptions::new().read(true).open(filepath)?;
let reader = BufReader::new(file);
//按行读取
for line in reader.lines() {
let str: String = line.unwrap();
println!("{}", str);
}
Ok(())
}
//BufWriter带缓冲写入
fn write_file_buffer(filepath: &str) -> Result<(), Box<dyn std::error::Error>> {
let file = OpenOptions::new()
.create(true)
.append(true)
.open(filepath)?;
let mut reader = BufWriter::new(file);
// 带缓冲写入
reader.write(b"hello\n")?;
reader.write(b"word\n")?;
//确保缓冲中的内容全部写入文件
reader.flush()?;
Ok(())
}
其中test1.txt文件内容如下:
白日依山尽,
黄河入海流。
运行效果如下:
生成的test2.txt文件,内容如下:
hello
word