Rust文件读写
文件读写之前先简单介绍一下rust的两个常见enum。
enum Option<T>{
Some(T),
None,
}
这里的Option是一个泛型enum,它可以接收任意类型T
然后包装其为一个Option enum。举个例子,有时候我们读文件的时候,成功读取则返回”success”否则返回”None”。Rust是编译型语言,作为返回值的两个分支必须是相同的类型否则则无法通过编译。当然我们可以返回一个””空字符串,但不够优雅。enum结合泛型就能封装任意类型为特定的enum。这里的Option
enum Result<T, E> {
Ok(T),
Err(E),
}
文件读
fn file_to_str(filename: String) -> String {
let mut file = fs::File::open(filename).expect("无法打开文件");
let mut mesg = String::new();
file.read_to_string(&mut mesg);
mesg
}
上面的代码中读取filename中的文件为字符串,类似于python中的f.read()。fs::File::open(filename)
返回的就是一个Result,这里成功打开结果就是File类型的file,否则爆出”无法打开文件”的错误。文件读取为向量:
fn file_to_vec(filename: String) -> std::io::Result<Vec<u8>> {
let mut file = fs::File::open(filename).expect("无法打开文件");
let mut buf = Vec::new();//创建一个空的向量
file.read_to_end(&mut buf);//将读取的内容的数值写入向量
return Ok(buf);//返回包装之后的Result
}
上述代码中,文件字符使用uint8编码,类似于python中的byte。直接打印输出则会输出数值。
fn file_to_vec_with_buffer(filename: String) -> std::io::Result<Vec<String>> {
let mut file = fs::File::open(filename).expect("无法打开文件");
let io_buffer = BufReader::new(file);
io_buffer.lines().into_iter().collect()
}
使用BufReader
读取文件行保存为Vec<String>
,结果封装在Result中。完整代码:
use std::fs;
use std::io::BufRead;
use std::io::{BufReader, Read};
fn file_to_str(filename: &String) -> String {
let mut file = fs::File::open(filename).expect("无法打开文件");
let mut mesg = String::new();
file.read_to_string(&mut mesg);
mesg
}
fn file_to_vec(filename: &String) -> std::io::Result<Vec<u8>> {
let mut file = fs::File::open(filename).expect("无法打开文件");
let mut buf = Vec::new();
file.read_to_end(&mut buf);
return Ok(buf);
}
fn file_to_vec_with_buffer(filename: &String) -> std::io::Result<Vec<String>> {
let mut file = fs::File::open(filename).expect("无法打开文件");
let io_buffer = BufReader::new(file);
io_buffer.lines().into_iter().collect()
}
fn main() {
let filename = "/tmp/log".to_string();
let msg = file_to_str(&filename);
println!("line is :{:?}", msg);
}
文件写
fn write_msg_to_file(filename: &String, msg: &str) {
let mut file = fs::File::create(filename).unwrap();
write!(file, "{}", msg);
}
或者:
fn write_msg_to_file(filename: &String, msg: &str) {
let mut file = fs::File::create(filename).unwrap();
file.write(msg.as_bytes());
}
完整代码:
use std::fs;
use std::io::Write;
fn write_msg_to_file(filename: &String, msg: &str) {
let mut file = fs::File::create(filename).unwrap();
file.write(msg.as_bytes());
}
fn main() {
let filename = "/tmp/log".to_string();
let mesg = "hello world\n你好世界";
write_msg_to_file(&filename, &mesg);
}
Result 常见API
is_ok(self)->bool
:如果Result是Ok
则返回true,否则返回false。is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool
:如果Result是ok的话进一步判断。is_err(&self) -> bool
:如果是Err
则返回true否则返回false。is_err_and(self, f: impl FnOnce(E) -> bool) -> bool
:如果是Err
再使用函数判断。ok(self) -> Option<T>
:将Ok转换为Option。 err(self) -> Option<E>
:将Err转换为Option。 as_ref(&self) -> Result<&T, &E>
:转换 &Result<T, E> 为 Result<&T, &E>。as_mut(&mut self) -> Result<&mut T, &mut E>
:转换 Result<&T, &E> 为 &Result<T, E> 。map<U, F>(self, op: F) -> Result<U, E>
:映射Result<T, E> 为 Result<U, E>,此函数在Ok
状态下执行映射函数。map_or<U, F>(self, default: U, f: F) -> U
:如果为Ok
则执行映射函数否则返回默认值Default。map_or_else<U, D, F>(self, default: D, f: F) -> U
:如果是Ok
则执行映射函数f,否则在Err
上执行d。map_err<F, O>(self, op: O) -> Result<T, F>
:如果是Ok
则直接返回本身,否则对Err
使用映射函数。inspect<F>(self, f: F) -> Result<T, E>
:如果是Ok
则以引用的形式调用函数。inspect_err<F>(self, f: F) -> Result<T, E>
:如果是Err
则以引用的形式调用函数。as_deref(&self) -> Result<&<T as Deref>::Target, &E>
:转换Result<T, E> (或者 &Result<T, E>) 为 Result<&::Target, &E>。 as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
:转换Result<T, E> (或者 &mut Result<T, E>) 为 Result<&mut::Target, &mut E>。 iter(&self) -> Iter<'_, T>
:返回迭代器,如果为Ok
则返回Result::Ok的值否则为None。iter_mut(&mut self) -> IterMut<'_, T>
:返回迭代器,如果为Ok
则返回Result::Ok的值否则为None。其中返回值可以被修改。expect(self, msg: &str) -> T
:返回Ok
包含的值,如果是Err
则报错。unwrap(self) -> T
:如果为Ok
则返回值本身否则将报错。unwrap_or_default()
:如果为Ok
则返回值否则返回默认值。expect_err(self, msg: &str) -> E where T:Debug
:返回Err
的值,如果是Ok
则报错。unwrap_err(self)->E where T:Debug
:返回Err
包含的值。into_ok(self) -> T where E:Into<!>
:返回Ok
包含的值,不报任何错误。into_err(self)->E where T:Into<!>
:返回Err
包含的值,不报任何错误。and<U>(self, res: Result<U, E>) -> Result<U, E>
:如果是Ok
则返回res否则返回self。and_then<U, F>(self, op: F) -> Result<U, E> where F:FnOnce(T)->Result(U,E)
:如果是Ok
则调用op
否则返回对应的Err
值。or<F>(self, res: Result<T, F>) -> Result<T, F>
:如果是Err
则返回res否则返回对应的Ok
。or_else<F, O>(self, op: O) -> Result<T, F> where O: FnOnce(E) -> Result<T, F>
:如果结果为Err
则调用op否则返回Ok
本身。unwrap_or(self, default: T) -> T
:返回Ok
的值否则提供默认值。unwrap_or_else<F>(self, op: F) -> T where F: FnOnce(E) -> T
:返回Ok
的值或者返回使用闭包计算的值。unwrap_unchecked(self) -> T(Unsafe)
:返回包含Ok
的值,不检查是否为Err
。调用此方法可能产生未定义的行为。unwrap_err_unchecked(self) -> E(Unsafe)
:返回Err
包含的值不检查是否为Ok
。调用此方法可能产生未定义的行为。copied(self) -> Result<T, E> where T:Copy
:通过拷贝Ok
的内容,映射Result<&T, E> 为Result<T, E>。cloned(self) -> Result<T, E>
:通过cloneOk
的值映射Result<&T, E> 为 Result<T, E>。transpose(self) -> Option<Result<T, E>>
:transpose 一个Result为另一个Result。Ok(None)
被映射为None
。Ok(Some(_))
和Err(_)
被映射为Some(Ok(_))
和Some(Err(_))
。flatten(self) -> Result<T, E>
:转换Result<Result<T, E>, E> 为 Result<T, E>。from_iter<I>(iter: I) -> Result<V, E> where I: IntoIterator<Item = Result<A, E>>
:将容器中的每个元素拿出来然后使用Ok
包装,否则返回Err
。into_iter(self) -> IntoIter<T>
:如果值为Ok
则返回包含值的迭代器。product<I>(iter: I) -> Result<T, E>
:如果为Ok
则取出每一个元素累乘后包装,否则Err
插入其中。sum<I>(iter: I) -> Result<T, E> where I: Iterator<Item = Result<U, E>>,
:一直获取其中的元素直到无法获取下一个元素或者其本身为Err
为止,返回元素的和。report(self) -> ExitCode
:调用函数返回状态码。