- 第1章:基础
Rust 文件与 IO
命令行程序必须能够接收来自命令行环境的参数,这些参数往往在一条命令行的命令之后以空格符分隔。
在很多语言中(如 Java 和 C/C++)环境参数是以主函数的参数(常常是一个字符串数组)传递给程序的,但在 Rust 中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出,过程十分简单:
fn main() {
let args = std::env::args();
println!("{:?}", args);
}
也许你得到的结果比这个要长的多,这很正常,这个结果中 Args 结构体中有一个 inner 数组,只包含唯一的字符串,代表了当前运行的程序所在的位置。
但这个数据结构令人难以理解,没关系,我们可以简单地遍历它:
fn main() {
let args = std::env::args();
for arg in args {
println!("{}", arg);
}
}
一般参数们就是用来被遍历的,不是吗。
现在我们打开许久未碰的 launch.json ,找到 "args": [],这里可以设置运行时的参数,我们将它写成 "args": ["first", "second"] ,然后保存、再次运行刚才的程序,运行结果:
在 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);
}
注意:目前 Rust 标准库还没有提供直接从命令行读取数字或格式化数据的方法,我们可以读取一行字符串并使用字符串识别函数处理数据。
use std::io::prelude::*;
use std::fs::File;
use std::fs;
fn main() {
let mut file = File::create("/data/wwwroot/default/Data/text.txt").unwrap();
file.write(b"This is a text file.").unwrap();
let text = fs::read_to_string("/data/wwwroot/default/Data/text.txt").unwrap();
println!("{}", text);
}
但如果要读取的文件是二进制文件,我们可以用 std::fs::read 函数读取 u8 类型集合:
use std::fs; fn main() {
let content = fs::read("/data/wwwroot/default/Data/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("/data/wwwroot/default/Data/text.txt").unwrap();
file.read(&mut buffer).unwrap();
println!("{:?}", buffer);
file.read(&mut buffer).unwrap();
println!("{:?}", buffer);
}
运行结果:std::fs::File 的 open 方法是"只读"打开文件,并且没有配套的 close 方法,因为 Rust 编译器可以在文件不再被使用时自动关闭文件。
一次性写入:
use std::fs; fn main() {
fs::write("/data/wwwroot/default/Data/text.txt", "FROM RUST PROGRAM") .unwrap();
}
如果想使用流的方式写入文件内容,可以使用 std::fs::File 的 create 方法:
use std::io::prelude::*;
use std::fs::File;
fn main() {
let mut file = File::create("/data/wwwroot/default/Data/text.txt").unwrap();
file.write(b"FROM RUST PROGRAM").unwrap();
}
这段程序与上一个程序等价。
File 类中不存在 append 静态方法,但是我们可以使用 OpenOptions 来实现用特定方法打开文件:
use std::io::prelude::*;
use std::fs::OpenOptions;
fn main() -> std::io::Result < () > {
let mut file = OpenOptions::new() .append(true).open("/data/wwwroot/default/Data/text.txt")?;
file.write(b" APPEND WORD")?;
Ok(())
}
运行之后,/data/wwwroot/default/Data/text.txt文件内容将变成:
use std::io::prelude::*;
use std::fs::OpenOptions;
fn main() -> std::io::Result < () > {
let mut file = OpenOptions::new() .read(true).write(true).open("/data/wwwroot/default/Data/text.txt")?;
file.write(b"COVER")?;
Ok(())
}
运行之后,D:\text.txt 文件内容将变成:
网友评论0