文章目录
- 0、引入
- 1、命令行
- 1.1 命令行参数
- 1.2 命令行输入
- 2、文件操作
- 2.1 读取文件
- 2.2 写入文件
- 3、总结
0、引入
Rust 语言的 I/O 操作,最基本的交互模式,主流语言都具备的功能。
1、命令行
1.1 命令行参数
- 命令行程序是计算机程序最基础的存在形式,几乎所有的操作系统都支持命令行程序并将可视化程序的运行基于命令行机制。
- 命令行程序必须能够接收来自命令行环境的参数,这些参数往往在一条命令行的命令之后以空格符分隔。
- 在很多语言中(如 Java 和 C/C++)环境参数是以主函数的参数(常常是一个字符串数组)传递给程序的,但在 Rust中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出,过程十分简单:
(用了官方的在线Rust debug 传送门)
fn main() {
let args = std::env::args();
println!("{:?}", args);
}
返回结果:Args { inner: ["target/debug/playground"] }
如果在vscode下面,找到可执行程序,用命令行启动exe 同时在后面加上参数就可以。
1.2 命令行输入
- 1、早期的章节详细讲述了如何使用命令行输出,这是由于语言学习的需要,没有输出是无法调试程序的。但从命令行获取输入的信息对于一个命令行程序来说依然是相当重要的。
- 2、std::io::Stdio 包含 read_line 读取方法,可以读取一行字符串到缓冲区,返回值都是 Result
枚举类,用于传递读取中出现的错误,所以常用 expect 或 unwrap 函数来处理错误; - 3、目前 Rust 标准库还没有提供直接从命令行读取数字或格式化数据的方法,我们可以读取一行字符串并使用字符串识别函数处理数据
- 4、在 Rust 中,std::io 模块提供了标准输入(可认为是命令行输入)的相关功能:
use std::io::stdin;
fn main() {
let mut str_buf = String::new();
stdin().read_line(&mut str_buf)
.expect("Failed to read line.");
println!("Your input line is \n{}", str_buf);
}
这一段还是和上面方法一样,用命令行去处理。
2、文件操作
2.1 读取文件
我们在计算机的 C:\ 目录下建立文件 text.txt,内容如下:This is a text file.
-
普通读取字符串
代码如下(示例):
use std::fs; fn main() { let text = fs::read_to_string("C:\\text.txt").unwrap(); println!("{}", text); }
-
读取的文件是二进制文件,我们可以用 std::fs::read 函数读取 u8 类型集合
use std::fs; fn main() { let content = fs::read("C:\\text.txt").unwrap(); println!("{:?}", content); }
-
Rust 中的文件流读取方式:
use std::io::prelude::*; use std::fs; fn main() { let mut buffer = [0u8; 5]; let mut file = fs::File::open("C:\\text.txt").unwrap(); file.read(&mut buffer).unwrap(); println!("{:?}", buffer); file.read(&mut buffer).unwrap(); println!("{:?}", buffer); }
2.2 写入文件
文件写入分为一次性写入和流式写入。流式写入需要打开文件,打开方式有"新建"(create)和"追加"(append)两种。
-
一次性写入:代码如下(示例):
use std::fs; fn main() { fs::write("C:\\text.txt", "FROM RUST PROGRAM") .unwrap(); }
注意:一次性写入会直接删除文件内容(无论文件多么大)。如果文件不存在就会创建文件。
-
流式写入:
use std::io::prelude::*; use std::fs::File; fn main() { let mut file = File::create("C:\\text.txt").unwrap(); file.write(b"FROM RUST PROGRAM").unwrap(); }
注意:打开的文件一定存放在可变的变量中才能使用 File 的方法!
File 类中不存在 append 静态方法,但是我们可以使用 OpenOptions 来实现用特定方法打开文件:use std::io::prelude::*; use std::fs::OpenOptions; fn main() -> std::io::Result<()> { let mut file = OpenOptions::new() .append(true).open("C:\\text.txt")?; file.write(b" APPEND WORD")?; Ok(()) }
OpenOptions 是一个灵活的打开文件的方法,它可以设置打开权限,除append 权限以外还有 read 权限和 write 权限,如果我们想以读写权限打开一个文件可以这样写:
use std::io::prelude::*; use std::fs::OpenOptions; fn main() -> std::io::Result<()> { let mut file = OpenOptions::new() .read(true).write(true).open("C:\\text.txt")?; file.write(b"COVER")?; Ok(()) }
3、总结
Rust中的IO操作和主流的语言差不多,只是在形式上有点出入,习惯之后就可以。