Rust - 标准输入输出

  • 简述

    本章讨论如何从标准输入(键盘)接受值并将值显示到标准输出(控制台)。在本章中,我们还将讨论传递命令行参数。
  • 读取器和写入器类型

    Rust 的输入和输出标准库功能围绕两个特征进行组织 -
    • Read
    • Write
    序号 特征 & 描述 示例
    1
    Read
    实现 Read 的类型具有面向字节输入的方法。他们被称为Reader
    Stdin,File
    2
    Write
    实现 Write 的类型支持面向字节和 UTF-8 文本输出。他们被称为Writer。
    Stdout,File
  • Read Trait

    Readers是您的程序可以从中读取字节的组件。示例包括从键盘、文件等读取输入。read_line() 此特征的方法可用于从文件或标准输入流中一次一行读取数据。
    序号 Trait 方法 & 描述
    1 Read
    read_line(&mut line)->Result
    读取一行文本并将其附加到 line,这是一个 String。返回值是一个 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是您的程序可以写入字节的组件。示例包括将值打印到控制台、写入文件等。此特征的 write() 方法可用于将数据写入文件或标准输出流。
    序号 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("JC2182 ".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();
    }
    

    输出

    
    JC2182
    bytes written 15
    
    stdout()标准库函数的句柄返回到当前进程的标准输出流中,向其中的write可以应用功能。write() 方法返回一个枚举 Result。unwrap() 是从枚举中提取实际结果的辅助方法。如果发生错误, unwrap 方法将发送错误。
    注意 − 文件 IO 将在下一章讨论。
  • 命令行参数

    命令行参数在执行之前传递给程序。它们就像传递给函数的参数。命令行参数可用于将值传递给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 jc2182
    NOTE- hellojc2182是命令行参数。

    输出

    
    No of elements in arguments is :3
    [main.exe]
    [hello]
    [jc2182]
    
    输出显示 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