📜  锈-输入输出

📅  最后修改于: 2020-11-02 04:22:18             🧑  作者: Mango


本章讨论如何接受来自标准输入(键盘)的值以及如何将值显示到标准输出(控制台)。在本章中,我们还将讨论传递命令行参数。

读者和作家类型

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

Sr.No Trait & Description Example
1

Read

Types that implement Read have methods for byte-oriented input. They’re called readers

Stdin,File
2

Write

Types that implement Write support both byte-oriented and UTF-8 text output. They’re called writers.

Stdout,File

阅读特质

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

Sr.No Trait Method & Description
1 Read

read_line(&mut line)->Result

Reads a line of text and appends it to line, which is a String. The return value is an io::Result, the number of bytes read.

插图-从控制台读取-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()方法可用于将数据写入文件或标准输出流。

Sr.No Trait Method & Description
1 Write

write(&buf)->Result

Writes some of the bytes in the slice buf to the underlying stream. It returns an io::Result, the number of bytes written.

插图-写入控制台-stdout()

打印!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方法将发送紧急消息。

–下一章将讨论文件IO。

命令行参数

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

注意-hellotutorialspoint是命令行参数。

输出

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::().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