Rust输入输出


本章讨论如何接受来自标准输入(键盘)的值、如何将值打印到标准输出(控制台),以及传递命令行参数。

Read和Write类型


Rust的输入和输出标准库功能围绕以下两个特征进行组织:

  • Read

  • Write

序号特性与描述例子
1

Read

实现Read的类型具有面向字节输入的方法。他们被称为读者

标准输入
2

Write

实现Write的类型同时支持面向字节和UTF-8的文本输出。他们被称为作家。

标准输出、文件

Read Trait


Readers是程序可以读取字节的组件,包括从键盘、文件等读取输入,此trait的read_line()方法可用于一次从文件或标准输入流中读取一行数据。

序号
Trait方法与说明
1Read

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.NoTrait方法与说明
1Write

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