首页 > 其他分享 >无涯教程-Rust - 输入&输出

无涯教程-Rust - 输入&输出

时间:2024-01-25 17:33:01浏览次数:29  
标签:std 教程 read 无涯 let println line main Rust

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

读和写

Rust的input和output标准库函数围绕两个特征进行组织-

  • Read 读
  • Write 写
Sr.No Trait & 描述 Example
1

Read - 实现Read的类型具有面向字节输入的方法。

Stdin,File
2

Write - 实现Write的类型同时支持面向字节和UTF-8的文本输出。

Stdout,File

Read Trait

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

Sr.No Trait Method & 描述
1 Read

read_line(&mut line)->Result

读取一行文本并将其附加到一行(字符串),返回值为io::Result,即读取的字节数。

控制台读取

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 :
Learnfk
Hello , Learnfk
no of bytes read , 10

Write Trait

Writers是程序可以向其写入字节的组件,示例包括将值打印到控制台,写入文件等,此特征的write()方法可用于将数据写入文件或标准输出流。

Sr.No Trait Method & 描述
1 Write

write(&buf)->Result

将切片buf中的某些字节写入基础流,它返回io::Result,即写入的字节数。

写入控制台

print!或 println!宏可用于在控制台上显示文本,但是,您也可以使用 write()标准库函数向标准输出显示一些文本。

让我们考虑一个示例来理解这一点。

use std::io::Write;
fn main() {
   let b1=std::io::stdout().write("LearnFK ".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();
}
LearnFK Point
bytes written 15

stdout()标准库函数返回当前进程的标准输出示例的句柄,可以将 write 函数应用到该句柄, write()方法返回一个枚举结构, 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); //打印所有传递的值
      as commandline arguments
   }
}

编译后,程序将生成文件 main.exe,多个命令行参数应以空格分隔,从终端执行main.exe作为 main.exe hello learnfk 。

No of elements in arguments is :3
[main.exe]
[hello]
[learnfk]

输出显示3个参数,因为 main.exe 是第一个参数。

下面的程序计算作为命令行参数传递的值的总和,由空格分隔的列表整数值将传递给程序。

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

参考链接

https://www.learnfk.com/rust/rust-input-output.html

标签:std,教程,read,无涯,let,println,line,main,Rust
From: https://blog.51cto.com/u_14033984/9416289

相关文章

  • Spring的事务使用教程
    什么是事务?事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败。事务四个特性(ACID)原子性一组操作要么都成功,要么都失败。一致性一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。隔离性事务1......
  • 25从零开始用Rust编写nginx,序列化之serde是如何工作的
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy序......
  • 无涯教程-Rust - 错误处理
    在Rust中,错误可以分为两大类,如下表所示。Name&描述UsageRecoverable可恢复的错误ResultenumUnRecoverable无法恢复的错误panicmacro与其他编程语言不同,Rust没有Exception异常,它返回可恢复错误的枚举Result<T,E>,如果程序遇到不可恢复的错误,则调用panic宏。Panic......
  • Rust 一个 I/O 项目:构建一个命令行程序
    本篇在原文基础上有删减和添加,增加了一些细节内容,原文请参考一个I/O项目:构建一个命令行程序。目录接受命令行参数读取参数值将参数值保存进变量读取文件重构改进模块性和错误处理二进制项目的关注分离提取参数解析器组合配置值使用clone的权衡取舍创建一个Config的构造函数......
  • 【精品教程】如何查看iOS崩溃日志
    简介当一个应用程序崩溃,会产生一个崩溃报告(crashreport),并存储到设备中。崩溃报告描述了应用程序崩溃的条件,通常包含每个执行线程的完整回溯。查看崩溃报告可以帮助我们了解应用程序的崩溃情况,并尝试修复问题。符号化崩溃报告崩溃报告需要进行符号化(symbolicated),才能够进行分析......
  • 教程|幻兽帕鲁服务器数据备份与恢复
    搭建幻兽帕鲁个人服务器,最近不少用户碰到内存不足、游戏坏档之类的问题。做好定时备份,才能轻松快速恢复游戏进度这里讲一下如何定时将服务器数据备份到腾讯云轻量对象存储服务,以及如何在有需要的时候进行数据恢复。服务器中间的数据迁移,也可以参考本指南,免去手动拷贝数据,直接使用......
  • rust使用lazy_static对全局变量多线程并发读写示例
    首先需要在项目依赖Cargo.toml添加lazy_static依赖项[dependencies]lazy_static="1.4.0"示例代码如下:uselazy_static::lazy_static;usestd::sync::{RwLock,RwLockReadGuard,RwLockWriteGuard};usestd::thread;#[derive(Debug)]structSharedData{data:Vec<......
  • 无涯教程-Rust - 元组(Tuple)
    元组是复合数据类型,标量类型只能存储一种类型的数据,如一个i32变量只能存储一个整数值。在复合类型中,我们可以存储多个值,并且可以是不同类型。元组的长度是固定的,一旦声明,它们就无法增长或缩小,元组索引从0开始。Tuple-语法//语法1lettuple_name:(data_type1,data_type2,d......
  • Vue2入门之超详细教程十六-过滤器
    Vue2入门之超详细教程十六-过滤器1、简介过滤器定义:对要显示的数据进行特点格式化后再显示(适用于一些简单逻辑的处理)语法:1.注册过滤器:Vue.filter(name,callback)或newVue(filters:{})2.使用过滤器:{{xxx|郭琪琪名}}或v-bind:属性="xxx|过滤器名称"备注:1.过......
  • 转载——Linux/Macos环境下使用 steamcommunity 302 教程
    原博:https://www.dogfight360.com/blog/2319/steamcommunity302后端使用caddy,在生成所有配置文件后可直接迁移到Linux/Macos环境下使用1.首先要在Windows环境/Wine下运行steamcommunity302并在设置里打勾需要开启的功能,然后正常启动服务 2.前往caddy/release页下载......