Rust语言从入门到入坑——(10)文件与IO

news2024/9/28 11:22:09

文章目录

  • 0、引入
  • 1、命令行
    • 1.1 命令行参数
    • 1.2 命令行输入
  • 2、文件操作
    • 2.1 读取文件
    • 2.2 写入文件
  • 3、总结


在这里插入图片描述

0、引入

Rust 语言的 I/O 操作,最基本的交互模式,主流语言都具备的功能。


1、命令行

1.1 命令行参数

  • 命令行程序是计算机程序最基础的存在形式,几乎所有的操作系统都支持命令行程序并将可视化程序的运行基于命令行机制。
  • 命令行程序必须能够接收来自命令行环境的参数,这些参数往往在一条命令行的命令之后以空格符分隔。
  • 在很多语言中(如 Java 和 C/C++)环境参数是以主函数的参数(常常是一个字符串数组)传递给程序的,但在 Rust中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出,过程十分简单:
    (用了官方的在线Rust debug 传送门)
fn main() {
    let args = std::env::args();
    println!("{:?}", args);
}

返回结果:Args { inner: ["target/debug/playground"] }

如果在vscode下面,找到可执行程序,用命令行启动exe 同时在后面加上参数就可以。

1.2 命令行输入

  • 1、早期的章节详细讲述了如何使用命令行输出,这是由于语言学习的需要,没有输出是无法调试程序的。但从命令行获取输入的信息对于一个命令行程序来说依然是相当重要的。
  • 2、std::io::Stdio 包含 read_line 读取方法,可以读取一行字符串到缓冲区,返回值都是 Result
    枚举类,用于传递读取中出现的错误,所以常用 expect 或 unwrap 函数来处理错误;
  • 3、目前 Rust 标准库还没有提供直接从命令行读取数字或格式化数据的方法,我们可以读取一行字符串并使用字符串识别函数处理数据
  • 4、在 Rust 中,std::io 模块提供了标准输入(可认为是命令行输入)的相关功能:
use std::io::stdin;

fn main() {
let mut str_buf = String::new();
    stdin().read_line(&mut str_buf)
        .expect("Failed to read line.");

    println!("Your input line is \n{}", str_buf);
}

这一段还是和上面方法一样,用命令行去处理。


2、文件操作

2.1 读取文件

我们在计算机的 C:\ 目录下建立文件 text.txt,内容如下:This is a text file.

  1. 普通读取字符串

    代码如下(示例):

    use std::fs;
    fn main() {
        let text = fs::read_to_string("C:\\text.txt").unwrap();
        println!("{}", text);
    }
    
  2. 读取的文件是二进制文件,我们可以用 std::fs::read 函数读取 u8 类型集合

    use std::fs;
    
    fn main() {
        let content = fs::read("C:\\text.txt").unwrap();
        println!("{:?}", content);
    }
    
  3. Rust 中的文件流读取方式:

    use std::io::prelude::*;
    use std::fs;
    
    fn main() {
        let mut buffer = [0u8; 5];
        let mut file = fs::File::open("C:\\text.txt").unwrap();
        file.read(&mut buffer).unwrap();
        println!("{:?}", buffer);
        file.read(&mut buffer).unwrap();
        println!("{:?}", buffer);
    }
    

2.2 写入文件

文件写入分为一次性写入和流式写入。流式写入需要打开文件,打开方式有"新建"(create)和"追加"(append)两种。

  1. 一次性写入:代码如下(示例):

    use std::fs;
    fn main() {
        fs::write("C:\\text.txt", "FROM RUST PROGRAM")
            .unwrap();
    }
    

    注意:一次性写入会直接删除文件内容(无论文件多么大)。如果文件不存在就会创建文件。

  2. 流式写入:

    use std::io::prelude::*;
    use std::fs::File;
    
    fn main() {
        let mut file = File::create("C:\\text.txt").unwrap();
        file.write(b"FROM RUST PROGRAM").unwrap();
    }
    

    注意:打开的文件一定存放在可变的变量中才能使用 File 的方法!
    File 类中不存在 append 静态方法,但是我们可以使用 OpenOptions 来实现用特定方法打开文件:

    use std::io::prelude::*;
    use std::fs::OpenOptions;
    
    fn main() -> std::io::Result<()> {
       
        let mut file = OpenOptions::new()
                .append(true).open("C:\\text.txt")?;
    
        file.write(b" APPEND WORD")?;
    
        Ok(())
    }
    

    OpenOptions 是一个灵活的打开文件的方法,它可以设置打开权限,除append 权限以外还有 read 权限和 write 权限,如果我们想以读写权限打开一个文件可以这样写:

    use std::io::prelude::*;
    use std::fs::OpenOptions;
    
    fn main() -> std::io::Result<()> {
       
        let mut file = OpenOptions::new()
                .read(true).write(true).open("C:\\text.txt")?;
    
        file.write(b"COVER")?;
    
        Ok(())
    }
    

3、总结

Rust中的IO操作和主流的语言差不多,只是在形式上有点出入,习惯之后就可以。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/688243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B050-cms05-轮播图 cookie session 登录

目录 轮播图修改操作删除操作查询并展示所有轮播图 无状态的HTTP协议CookieCookie的原理Cookie的创建获取Cookie更新Cookie设置cookie的声明周期设置cookie访问路径Cookie优缺点 SessionSession原理创建SessionSession的使用sesion的生命周期Session的优缺点Cookie和Session的区…

定积分计算—牛顿-莱布尼兹公式、定积分的几何意义、利用奇偶性化简、利用Wallis公式

定积分计算 前言定积分的常规计算技巧—牛顿-莱布尼茨公式定积分的几何意义利用奇偶性简化计算![在这里插入图片描述](https://img-blog.csdnimg.cn/9acfec48362141ba9486630f7060d78d.jpg)利用周期性平移和缩小积分区间利用Wallis公式利用一个常见的积分公式定积分计算练习题 …

yolov8 -01 部署

本想去配环境的步骤&#xff0c;在之前yolov5运行的环境下&#xff0c;试predict yolov8&#xff0c;竟然报错。 与其改bug, 选择重头来。 1. conda 创建新环境 yolo 8 conda create -n yolo82. 官网下载资料 官网下载yolo8相关资料 https://github.com/ultralytics/ultraly…

Flutter 检查连接网络 connectivity_plus

Flutter 检查连接网络 connectivity_plus 前言 有些对通讯敏感的程序&#xff0c;我们需要检查当前连接的网络情况。 我推荐使用 connectivity_plus https://pub-web.flutter-io.cn/packages/connectivity_plus 这个插件的好处就是支持全平台&#xff0c;这点非常好。 我们今天…

socketio连接失败,nginx返回502 connect() failed (111: Connection refused)

现象 我们信控平台&#xff0c;需要实时展示信号灯灯态&#xff08;红黄绿、倒计时等&#xff09; 当灯态变化时&#xff0c;前端信号机设备会通过socket协议将消息推送给我们的通信服务&#xff0c;通信服务将消息解析处理后&#xff0c;关联路口信息&#xff0c;再把信息通过…

数据库监控与调优【四】—— EXPLAIN详解

EXPLAIN详解&#xff08;使用、可视化、扩展与性能计算公式&#xff09; TIPS 本文基于MySQL 8.0编写&#xff0c;理论支持MySQL 5.0及更高版本。 什么是EXPLAIN命令 EXPLAIN命令是查看MySQL查询优化器如何执行查询的主要方法&#xff0c;可以很好地分析SQL语句的执行情况。每…

MPLS新手排查丢包问题

借助查问题又重新复习了一下mpls协议&#xff0c;首先复习一下它的报文格式&#xff1a; 0---------------19-------22---23------------31 | Label value | Exp | Bos | TTL | -----------------|---------|-------|-------------| 字段意义&#xff1a; Label v…

全网最新超详细的【Axure】Axure RP 10的下载、安装、中文字体、授权【2023年】

文章目录 1. 文章引言2. 下载Axure103. 安装Axure104. Axure10中文5. 解决axure弹框更新的问题6. 重要备注7. Axure10授权 1. 文章引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择了Axure。 接下来&…

ansible自动化IT工具安装部署与使用验证

目录 一、环境配置 1、关闭防火墙 2、免密登录配置 3、同步时区 二、服务端配置 1、安装软件 2、查看版本 3、实现远程控制huyang3 4、测试 结果验证&#xff1a; 一、环境配置 1、关闭防火墙 systemctl stop firewalld iptables -F setenforce0 2、免密登录配置 【huy…

二叉树题目:二叉树展开为链表

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 后记 题目 标题和出处 标题&#xff1a;二叉树展开为链表 出处&#xff1a;114. 二叉树展开为链表 难度 3 级 …

8 从0开始学PyTorch | PyTorch中自动计算梯度、使用优化器

上一节&#xff0c;我们写了很多代码&#xff0c;但是不知道你有没有注意&#xff0c;那些代码看起来跟PyTorch关系并不是很大啊&#xff0c;貌似很多都是Python原生代码&#xff1f; 如果你是这样的感觉&#xff0c;那我要告诉你&#xff0c;你感觉的没有错。前面主要在于机制…

下面告诉你音频转换工具有哪些

今天我想和大家聊一聊音频转换工具。你是不是有时候想把一首酷炫的歌曲转换成你喜欢的音频格式&#xff0c;或者想把录音文件转成可编辑的格式&#xff1f;别担心&#xff0c;这里有一些超赞的音频转换工具&#xff0c;可以帮你解决这些问题&#xff01;无论是从MP3到WAV&#…

武汉大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 武汉大学&#xff08;A-&#xff09;考研难度&#xff08;☆☆☆☆☆&#xff09; 武汉大学计算机考研招生学院是计算机学院、国家网络安全学院和测绘遥感信息工程国家重点实验室。目前均已出拟录取名单。 武汉大学计…

Redis的3大特殊数据类型(1)-BitMap

BitMap(位图/位数组)是Redis2.2.0版本中引入的一种新数据类型&#xff0c;该数据类型本质是一个仅含0和1的二进制字符串。因此可以把 Bitmap 想象成一个以位为单位的数组&#xff0c;数组的每个单元只能存储 0 和 1&#xff0c;数组的下标在 Bitmap 中叫做偏移量 offset&#x…

volatile关键字和ThreadLocal

作用&#xff1a; 1.线程的可见性&#xff1a;当一个线程修改一个共享变量时&#xff0c;另外一个线程能读到这个修改的值。 2. 顺序一致性&#xff1a;禁止指令重排序。 线程之间的共享变量存储在主内存中&#xff08;Main Memory&#xff09;中&#xff0c;每个线程都一个都…

StarRocks Friends 上海站活动回顾(含 PPT 下载链接)

6月17日&#xff0c; StarRocks & Friends 上海站活动如期而至&#xff0c;近百位社区小伙伴参与交流活动&#xff1b;针对 StarRocks 存算分离、StarRocks 在业界的应用实践、以及 StarRocks 与 BI 结合、湖仓一体规划等话题展开激烈的交流互动。 本文总结了技术交流活动…

未来的彩电,彩电的未来

疫情后的首个线上大促已经结束&#xff0c;“史上投入最大618”也没能抵住彩电市场整体的需求疲软。 根据奥维云网线上推总数据&#xff0c;2023年618期间&#xff0c;中国彩电线上市场零售量规模为249.9万台&#xff0c;同比下降12.9%&#xff1b;零售额规模为79.7亿元&#…

配电柜(箱)使用防雷浪涌保护器的作用和方案

配电箱是电力系统中的重要组成部分&#xff0c;负责将电力从供电系统输送到各个电器设备。然而&#xff0c;由于天气状况和其他因素的影响&#xff0c;电力系统可能会受到雷击引起的浪涌电压的威胁。为了保护配电箱和其中的设备免受浪涌电压的破坏&#xff0c;我们需要在配电箱…

Redis中3大特殊数据结构(2)-HyperLogLog

HyperLogLog算法是法国人Philippe Flajolet 教授发明的一种基数计数概率算法&#xff0c;每个 HyperLogLog 键只需要花费 12 KB 内存&#xff0c;就可以计算接近 2^64 个不同元素的基数。HyperLogLog 适用于大数据量的去重统计&#xff0c;HyperLogLog 提供不精确的去重计数方案…

基于Java+Swing实现餐厅点餐系统

基于JavaSwing实现餐厅点餐系统 一、系统介绍二、系统展示1.主页2.点菜3.下单4.结算5.销售情况&#xff08;管理员&#xff09; 三、系统实现四、其他系统五、获取源码 一、系统介绍 该系统针对两个方面的用户&#xff0c;一个是用餐客户&#xff0c;另一个是餐厅管理员。将功…