Rust输入输出
本章讨论如何接受来自标准输入(键盘)的值、如何将值打印到标准输出(控制台),以及传递命令行参数。
Read和Write类型
Rust的输入和输出标准库功能围绕以下两个特征进行组织:
Read
Write
序号 | 特性与描述 | 例子 |
---|---|---|
1 | Read 实现Read的类型具有面向字节输入的方法。他们被称为读者 | 标准输入 |
2 | Write 实现Write的类型同时支持面向字节和UTF-8的文本输出。他们被称为作家。 | 标准输出、文件 |
Read Trait
Readers是程序可以读取字节的组件,包括从键盘、文件等读取输入,此trait的read_line()方法可用于一次从文件或标准输入流中读取一行数据。
序号 | Trait | 方法与说明 |
---|---|---|
1 | Read | read_line(&mut line)->结果 读取一行文本并将其附加到一行(即字符串)上。返回值为io :: Result,即读取的字节数。 |
例子:从控制台读取:stdin()
Rust程序可能必须在运行时接受来自用户的值。以下示例从标准输入(键盘)读取值,并将其打印到控制台。
fn main(){ let mut line = String::new(); println!("Enter your name :"); let b1 = std::io::stdin().read_line(&mut line).unwrap(); println!("Hello , {}", line); println!("no of bytes read , {}", b1); }
stdin() 函数返回当前流程的标准输入流的句柄, 该句柄包含read_line函数。当遇到行尾字符时,此函数尝试读取输入缓冲区中存在的所有字符。
Enter your name : Mohtashim Hello , Mohtashim no of bytes read , 10
Write Trait
Writers是程序可以向其写入字节的组件,包括将值打印到控制台、写入文件等。此trait的write()方法可用于将数据写入文件或标准输出流。
Sr.No | Trait | 方法与说明 |
---|---|---|
1 | Write | write(&buf)->Result 将切片buf中的某些字节写入基础流。它返回io :: Result,即写入的字节数。 |
例子-写入控制台-stdout()
print!或者println!宏可用于在控制台上打印文本,你也可以使用write()标准库函数向标准输出打印一些文本。
让我们考虑一个例子来理解这一点:
use std::io::Write; fn main() { let b1 = std::io::stdout().write("newbie ".as_bytes()).unwrap(); let b2 = std::io::stdout().write(String::from("go").as_bytes()).unwrap(); std::io::stdout().write(format!("\nbytes written {}",(b1+b2)).as_bytes()).unwrap(); }
newbie go bytes written 9
stdout() 标准库函数返回当前进程的标准输出流的句柄,该句柄包含write()函数,write()方法返回一个枚举Result,unwrap()是从枚举中提取实际结果的辅助方法。如果发生错误,unwrap方法将发送紧急消息。
命令行参数
在执行之前,将命令行参数传递给程序,它们就像传递给函数的参数一样。命令行参数可用于将值传递给 main() 函数,std::env::args()函数返回命令行参数。
例子
下面的示例将值作为命令行参数传递给main()函数。该程序是在文件名中创建的 main.rs .
// main.rs fn main(){ let cmd_line = std::env::args(); println!("No of elements in arguments is :{}",cmd_line.len()); //打印传递的值总数 for arg in cmd_line { println!("[{}]",arg); //打印所有命令行中传递的值 } }
编译后,该程序将生成一个文件 main.exe,执行./main.exe newbie go(多个命令行参数应以空格分隔),输出如下所示:
No of elements in arguments is :3 [main.exe] [newbie] [go]
命令行第一个参数是可执行文件的文件名。
例子
下面的程序计算作为命令行参数传递的值的总和。由空格分隔的列表整数值将传递给程序。
fn main(){ let cmd_line = std::env::args(); println!("No of elements in arguments is:{}",cmd_line.len()); //传递的元素总数 let mut sum = 0; let mut has_read_first_arg = false; //遍历所有参数并计算它们的总和 for arg in cmd_line { if has_read_first_arg { //跳过第一个参数,因为它是exe文件名 sum += arg.parse::<i32>().unwrap(); } has_read_first_arg = true; //将标志设置为true,以计算后续参数的总和。 } println!("sum is {}",sum); }
在以main.exe 1 2 3 4命令执行程序时,输出为:
No of elements in arguments is :5 sum is 10