Rust 输入输出
本章讨论如何从标准输入(键盘)接收值并将值显示到标准输出(控制台)。在本章中,我们还将讨论传递命令行参数。
读取器和写入器类型
Rust的标准库输入输出功能是围绕两个特性组织的−
- 读取(Read)
- 写入(Write)
序号 | 特性 & 描述 | 示例 |
---|---|---|
1 | 读取 实现Read特性的类型具有以字节为导向的输入方法。它们被称为读取者。 | 标准输入,文件 |
2 | 写入 实现Write特性的类型支持以字节为导向的和UTF-8文本输出。它们被称为写入者。 | 标准输出,文件 |
读取Trait
读取器 是您的程序可以从中读取字节的组件。示例包括从键盘、文件等读取输入。 该Trait的 read_line() 方法可以用于从文件或标准输入流逐行读取数据。
编号 | 特征 | 方法&描述 |
---|---|---|
1 | 读取 | **read_line( &mut line)->Result ** 读取一行文本并将其追加到字符串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
编写 Trait
编写器 是您的程序可以向其中写入字节的组件。例如将值打印到控制台、写入文件等。该 Trait 的 write() 方法可用于向文件或标准输出流写入数据。
序号 | 特性 | 方法和描述 |
---|---|---|
1 | 写入 | **write( &buf)->结果 ** 将切片buf中的一些字节写入底层流。它返回一个io::Result,即写入的字节数。 |
示例 – 写入控制台 – stdout()
使用 print! 或 println! 宏可以在控制台上显示文本。然而,你也可以使用 write() 标准库函数将一些文本显示到标准输出。
让我们考虑一个示例来理解这个。
use std::io::Write;
fn main() {
let b1 = std::io::stdout().write("Tutorials ".as_bytes()).unwrap();
let b2 = std::io::stdout().write(String::from("Point").as_bytes()).unwrap();
std::io::stdout().write(format!("\nbytes written {}",(b1+b2)).as_bytes()).unwrap();
}
输出
Tutorials Point
bytes written 15
stdout()标准库函数返回当前进程的标准输出流的句柄,可以将write函数应用于该句柄。write()方法返回一个枚举类型Result。unwrap()是一个辅助方法,用于从枚举中提取实际的结果。如果发生错误,unwrap方法将发出panic。
注意 −文件I/O在下一章中讨论。
命令行参数
在执行程序之前,命令行参数被传递给程序。它们就像传递给函数的参数。命令行参数可以用于将值传递给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());
//print total number of values passed
for arg in cmd_line {
println!("[{}]",arg); //print all values passed
as commandline arguments
}
}
程序编译后将生成一个文件 main.exe。多个命令行参数应该用空格分隔。从终端执行 main.exe,例如 main.exe hello tutorialspoint。
注意 - hello 和 tutorialspoint 是命令行参数。
输出
No of elements in arguments is :3
[main.exe]
[hello]
[tutorialspoint]
输出显示了3个参数,因为main.exe是第一个参数。
示例
下面的程序计算传递给命令行参数的值的总和。以空格分隔的整数值列表传递给程序。
fn main(){
let cmd_line = std::env::args();
println!("No of elements in arguments is
:{}",cmd_line.len());
// total number of elements passed
let mut sum = 0;
let mut has_read_first_arg = false;
//iterate through all the arguments and calculate their sum
for arg in cmd_line {
if has_read_first_arg { //skip the first argument since it is the exe file name
sum += arg.parse::<i32>().unwrap();
}
has_read_first_arg = true;
// set the flag to true to calculate sum for the subsequent arguments.
}
println!("sum is {}",sum);
}
在将程序执行为 main.exe 1 2 3 4 时,输出将为 –
No of elements in arguments is :5
sum is 10