【Rust】Rust獲取命令行參數以及IO操作

在這里插入圖片描述

?? 歡迎大家來到景天科技苑??

🎈🎈 養成好習慣,先贊后看哦~🎈🎈

🏆 作者簡介:景天科技苑
🏆《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。
🏆《博客》:Rust開發,Python全棧,Golang開發,云原生開發,PyQt5和Tkinter桌面開發,小程序開發,人工智能,js逆向,App逆向,網絡系統安全,數據分析,Django,fastapi,flask等框架,云原生K8S,linux,shell腳本等實操經驗,網站搭建,數據庫等分享。

所屬的專欄:Rust語言通關之路
景天的主頁:景天科技苑

在這里插入圖片描述

文章目錄

  • Rust獲取命令行參數以及IO操作
    • 1、接收命令行參數
      • 1.1 讀取參數值
      • 1.2 將參數值保存進變量
    • 2、Rust讀取文件
      • 2.1. 基本文件讀取
        • 2.1.1 一次性讀取整個文件到字符串
        • 2.1.2 一次性讀取整個文件到字節向量
      • 2.2. 逐行讀取文件
        • 2.2.1 使用 BufReader 逐行讀取
        • 2.2.2 使用 BufReader 讀取字節塊
      • 2.3 使用內存映射文件 (memmap2)
    • 3、Rust向文件中寫內容
    • 4、Rust序列化與反序列化

Rust獲取命令行參數以及IO操作

Rust作為一門系統編程語言,提供了強大且安全的I/O操作支持。與C/C++不同,Rust通過所有權系統和豐富的類型系統,在編譯期就能避免許多常見的I/O錯誤。Rust的標準庫std::io模塊包含了大多數I/O功能,而std::fs模塊則專門處理文件系統操作。

1、接收命令行參數

1.1 讀取參數值

Rust 標準庫提供的std::env::args 能夠獲取傳遞給它的命令行參數的值
這個函數返回一個傳遞給程序的命令行參數的 迭代器(iterator)。

use std::env;fn main() {let args: Vec<String> = env::args().collect();println!("{:?}", args);
}

首先使用 use 語句來將 std::env 模塊引入作用域以便可以使用它的 args 函數。
注意 std::env::args 函數被嵌套進了兩層模塊中。
當所需函數嵌套了多于一層模塊時,通常將父模塊引入作用域,而不是其自身。
這便于我們利用 std::env 中的其他函數。這比增加了 use std::env::args; 后僅僅使用 args 調用函數要更明確一些,因為 args 容易被錯認成一個定義于當前模塊的函數。

得到的第一個參數是生成的程序本身,后面都是命令行參數
在這里插入圖片描述

在 main 函數的第一行,我們調用了 env::args,并立即使用 collect 來創建了一個包含迭代器所有值的 vector。
collect 可以被用來創建很多類型的集合,所以這里顯式注明 args 的類型來指定我們需要一個字符串 vector。
雖然在 Rust 中我們很少會需要注明類型,然而 collect 是一個經常需要注明類型的函數,因為 Rust 不能推斷出你想要什么類型的集合。
最后,我們使用調試格式 :? 打印出 vector。

注意 vector 的第一個值是 “target\debug\myargs.exe”,它是我們二進制文件的名稱。這與 C 中的參數列表的行為相匹配,讓程序使用在執行時調用它們的名稱。
如果要在消息中打印它或者根據用于調用程序的命令行別名更改程序的行為,通常可以方便地訪問程序名稱,不過考慮到本章的目的,我們將忽略它并只保存所需的兩個參數。

注意args 函數和無效的 Unicode
注意 std::env::args 在其任何參數包含無效 Unicode 字符時會 panic。
如果你需要接受包含無效 Unicode 字符的參數,使用 std::env::args_os 代替。這在某些操作系統中可能發生
這個函數返回 OsString 值而不是 String 值。
OsString 值每個平臺都不一樣而且比 String 值處理起來更為復雜。

use std::env;fn main() {for arg in env::args_os() {println!("{:?}", arg);}
}

在這里插入圖片描述

1.2 將參數值保存進變量

打印出參數 vector 中的值展示了程序可以訪問指定為命令行參數的值。現在需要將這兩個參數的值保存進變量這樣就可以在程序的余下部分使用這些值了。

use std::env;fn main() {//獲取命令行參數let args: Vec<String> = env::args().collect();//獲取查詢字符串和文件名let query = &args[1];let filename = &args[2];println!("Searching for {}", query);println!("In file {}", filename);
}

正如之前打印出 vector 時所看到的,程序的名稱占據了 vector 的第一個值 args[0],所以我們從索引 1 開始。
myargs2 獲取的第一個參數是需要搜索的字符串,所以將其將第一個參數的引用存放在變量 query 中。第二個參數將是文件名,所以將第二個參數的引用放入變量 filename 中。
在這里插入圖片描述

2、Rust讀取文件

在 Rust 中讀取文件是常見的 I/O 操作,標準庫提供了多種方法來處理文件讀取。下面我將詳細介紹各種文件讀取方法及其適用場景

2.1. 基本文件讀取

2.1.1 一次性讀取整個文件到字符串
use std::fs;use std::io;//讀取文件內容
fn read_file(filename: &str) -> io::Result<String> {// 使用?來處理錯誤// ?會將錯誤傳遞給調用者// ?只能在返回Result的函數中使用// ?會將錯誤類型從io::Error轉換為io::Result<String>//fs::read_to_string返回Result<String, io::Error>let content = fs::read_to_string(filename)?;Ok(content)
}fn main() {let filename = "hello.txt";match read_file(filename) {Ok(content) => println!("File content: {}", content),Err(e) => println!("Error: {}", e),}
}

在這里插入圖片描述

2.1.2 一次性讀取整個文件到字節向量

用于讀取二進制文件

//讀取文件到字節向量
use std::fs;
use std::io;//讀取二進制文件內容
fn read_file(filename: &str) -> io::Result<Vec<u8>> {// 使用?來處理錯誤// ?會將錯誤傳遞給調用者// ?只能在返回Result的函數中使用// ?會將錯誤類型從io::Error轉換為io::Result<Vec<u8>>//fs::read返回Result<Vec<u8>, io::Error>let content = fs::read(filename)?;Ok(content)
}fn main() {let filename = "123.vip";match read_file(filename) {//打印文件的字節長度Ok(content) => println!("File clength: {}", content.len()),Err(e) => println!("Error: {}", e),}
}

在這里插入圖片描述

2.2. 逐行讀取文件

對于大文件,逐行讀取更高效且內存友好。

2.2.1 使用 BufReader 逐行讀取
//讀取大文件
use std::fs::File;
use std::io::{ BufRead, BufReader };//讀取大文件內容
fn read_file(filename: &str) -> std::io::Result<()> {let file = File::open(filename)?;let reader = BufReader::new(file);for line in reader.lines() {println!("{}", line?);}Ok(())
}fn main() {let filename = "hello.txt";match read_file(filename) {Ok(()) => println!("File content: {}", filename),Err(e) => println!("Error: {}", e),}
}

在這里插入圖片描述

特點:
內存效率高
自動處理換行符
lines() 返回 Result<String>,需要處理可能的錯誤

2.2.2 使用 BufReader 讀取字節塊
//使用 BufReader 讀取字節塊
use std::io::{ self, Read };
use std::fs::File;//讀取字節塊
fn read_file(filename: &str) -> io::Result<()> {let file = File::open(filename)?;let mut reader = io::BufReader::new(file);//定義一個字節緩沖區//緩沖區的大小為1024字節let mut buffer = [0; 10];//循環讀取字節塊//read方法會將字節塊讀取到緩沖區中//read方法返回讀取的字節數//如果讀取到文件末尾,就退出循環loop {let n = reader.read(&mut buffer)?;if n == 0 {break; //讀取到文件末尾,退出循環}println!("Read {} bytes: {:?}", n, &buffer[..n]);// 處理 buffer[..n]}Ok(())
}fn main() {match read_file("Cargo.toml") {Ok(()) => println!("Read file successfully"),Err(e) => println!("Error: {}", e),}
}

在這里插入圖片描述

特點:
適用于二進制文件
可以控制緩沖區大小
適合網絡傳輸或處理大文件

2.3 使用內存映射文件 (memmap2)

對于超大文件,內存映射可以提高性能:

use std::fs::File;
use memmap2::Mmap;fn main() -> std::io::Result<()> {let file = File::open("Cargo.toml")?;//使用memmap2映射文件到內存,需要使用unsafe,需要注意let mmap = unsafe { Mmap::map(&file)? };// 假設我們搜索某個字節模式let pattern = b"\xDE\xAD\xBE\xEF";if let Some(pos) = mmap.windows(pattern.len()).position(|w| w == pattern) {println!("Pattern found at offset: {}", pos);} else {println!("Pattern not found");}Ok(())
}

注意:內存映射涉及 unsafe 代碼,需要謹慎使用。

3、Rust向文件中寫內容

//寫入文件
use std::fs;
use std::io;fn write_file(filename: &str, content: &str) -> io::Result<()> {fs::write(filename, content)
}fn main() {let filename = "hello.txt";let content = "你好,景天";match write_file(filename, content) {Ok(()) => println!("Write file successfully"),Err(e) => println!("Error: {}", e),}
}

在這里插入圖片描述

4、Rust序列化與反序列化

使用 serde 庫可以方便地進行 I/O 操作:
需要安裝第三方庫
cargo add serde
cargo add serde_json
并且在Cargo.toml中配置
在這里插入圖片描述

//序列化和反序列化
use serde::{ Serialize, Deserialize };
use std::fs;
use serde_json;#[derive(Serialize, Deserialize, Debug)]
#[allow(dead_code)]
struct Person {name: String,age: u8,phones: Vec<String>,
}fn main() {let person = Person {name: "John".to_string(),age: 30,phones: vec!["1234567890".to_string(), "0987654321".to_string()],};//序列化let json = serde_json::to_string(&person).unwrap(); //將結構體序列化為json字符串println!("json: {}", json);//將序列化后的數據寫入文件fs::write("person.json", json).unwrap(); //將數據寫入文件,json的所有權已經移動到write中了//反序列化// let person2: Person = serde_json::from_str(&json).unwrap(); //這里json所有權已不存在// println!("person2: {:?}", person2);//從文件中讀取數據并反序列化let json2 = fs::read_to_string("person.json").unwrap();let person3: Person = serde_json::from_str(&json2).unwrap();println!("person3: {:?}", person3);
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82209.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務中引入公共攔截器

本文使用的微服務版本為springcloudAlbaba :2021.0.4.0 微服務工程&#xff0c;一般公共的東西都放入一個工程&#xff0c;別的微服務都會引入這個工程&#xff0c;比如common-service,那么就可以在這個工程編寫一個攔截器&#xff1a;&#xff0c;比如&#xff1a; public cla…

Linux SLES 系統的/var/log/下的常見文件及其作用

在 SUSE Linux Enterprise Server&#xff08;SLES&#xff09; 系統中&#xff0c;/var/log/ 目錄是系統日志的集中地&#xff0c;存儲了各種服務、內核、系統消息的日志。以下是一些在 /var/log/ 下常見的日志文件及其功能&#xff1a; &#x1f4c2; 常見日志文件及功能 文…

oracle goldengate同步SQL server到SQL server的實時數據同步

參考文檔 https://docs.oracle.com/en/middleware/goldengate/core/19.1/oggmp/oracle-goldengate-classic-sql-server.html#GUID-948C5BEE-E7A0-4CE2-BE09-F83145677D18 https://docs.oracle.com/en/middleware/goldengate/core/21.3/ggcab/other-programs-and-settings-sql-…

語音轉文字工具

平時工作和學習比較忙&#xff0c;可能沒時間聽講座&#xff0c;只能看回放&#xff0c;回訪也很長&#xff0c;這時&#xff0c;我們可以借助語言轉文字&#xff0c;通過閱讀文字快速了解講座的重點&#xff0c;今天給大家分享一個本人經常用的語言轉文字工具&#xff0c;改工…

硬件實時時鐘(RTC)

硬件實時時鐘&#xff08;RTC&#xff09;詳解 硬件實時時鐘&#xff08;Real-Time Clock&#xff0c;RTC&#xff09;是計算機主板上的一個獨立計時芯片&#xff0c;用于在系統關機后持續記錄時間。它不依賴操作系統&#xff0c;由紐扣電池&#xff08;如CR2032&#xff09;供…

pycharm debug的時候無法debug到指定的位置就停住不動了

報錯大致是這樣的&#xff0c;但是直接run沒有問題&#xff0c;debug就停住不動了 Traceback (most recent call last): File "/home/mapengsen/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 467, in start_client s.connect((host, port)) Timeou…

Python6.1打卡(day33)

DAY 33 MLP神經網絡的訓練 知識點回顧&#xff1a; 1.PyTorch和cuda的安裝 2.查看顯卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3.cuda的檢查 4.簡單神經網絡的流程 1.數據預處理&#xff08;歸一化、轉換成張量&#xff09; 2.模型的定義 …

NodeJS全棧開發面試題講解——P11消息隊列(MQ)

? 11.1 為什么要用消息隊列&#xff1f;在哪些場景下最適合&#xff1f; ? 作用&#xff1a; 削峰填谷&#xff1a;緩解高并發壓力&#xff0c;異步處理任務&#xff08;如秒殺下單 → MQ → 異步扣庫存&#xff09; 解耦服務&#xff1a;上下游解耦&#xff08;如下單服務…

mysql執行sql語句報錯事務鎖住

報錯情況 1205 - Lock wait timeout exceeded; try restarting transaction先找出長時間運行的事務 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;終止長時間運行的事務 KILL [PROCESS_ID];

C#集合循環刪除某些行

你想要在遍歷集合&#xff08;例如List&#xff09;的同時刪除某些元素時&#xff0c;直接在循環中刪除元素可能會導致問題&#xff0c;因為這可能會改變集合的大小和導致索引問題&#xff1b; 可以用for循環的倒序來刪除&#xff1b; 如果要刪除滿足特定條件的所有元素&…

裂縫儀在線監測裝置:工程安全領域的“實時守衛者”

在基礎設施運維領域&#xff0c;裂縫擴展是威脅建筑結構安全的核心隱患之一。傳統人工巡檢方式存在效率低、時效性差、數據主觀性強等局限&#xff0c;而裂縫儀在線監測裝置通過技術迭代&#xff0c;實現了對結構裂縫的自動化、持續性追蹤&#xff0c;為工程安全評估提供科學依…

Multisim14使用教程詳盡版--(2025最新版)

一、Multisim14前言 1.1、主流電路仿真軟件 1. Multisim:NI開發的SPICE標準仿真工具,支持模擬/數字電路混合仿真,內置豐富的元件庫和虛擬儀器(示波器、頻譜儀等),適合教學和競賽設計。官網:艾默生旗下測試和測量系統 - NI。 2. LTspice XVII:ADI旗下免費高性能SPICE仿…

深度學習篇---人臉識別中的face-recognition庫和深度學習

深度學習方法和使用 Python 的face_recognition庫進行人臉識別在技術原理、實現方式和應用場景上有顯著區別&#xff0c;以下從多個維度對比分析&#xff1a; 一、技術原理 1. 深度學習方法 核心邏輯&#xff1a;基于神經網絡&#xff08;如卷積神經網絡 CNN&#xff09;構建…

Go語言中的數據類型轉換

Go 語言中只有強制類型轉換&#xff0c;沒有隱式類型轉換。 1. 數值類型之間的相互轉換 1.1. 整型和整型之間的轉換 package main import "fmt"func main() {var a int8 20var b int16 40fmt.Println(int16(a) b)// 60 }1.2. 浮點型和浮點型之間的轉換 packag…

行為型:中介者模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 5、注意事項 1、核心思想 目的&#xff1a;通過引入一個中介對象來封裝一組對象之間的交互&#xff0c;解決對象間過度耦合、頻繁交互的問題。不管是對象引用維護還是消息的轉發&am…

node_modules\node-sass: Command failed.報錯了

node_modules\node-sass: Command failed.錯誤解決 第一步&#xff1a;刪掉:目錄中劃紅線的配置文件 刪掉項目中的node_modules第二步&#xff1a;用admin權限執行&#xff0c;重新配置npm和yarn npm config set registry https://registry.npm.taobao.org --global npm con…

STM32 ADC工作原理與配置詳解

文章目錄 ADCADC簡介逐次逼近型ADCADC框圖ADC框圖的工作流程&#xff08;以規則組為例&#xff09;1. 輸入通道選擇與信號接入2. 觸發轉換&#xff1a;軟件或硬件觸發3. 采樣保持與量化編碼4. 轉換結果處理與存儲5. 狀態標志與中斷6. 參考電壓與時鐘驅動7. 輔助功能&#xff1a…

1、Pytorch介紹與安裝

1、Pytorch介紹 PyTorch 是由 Facebook AI Research (FAIR) 團隊開發并維護的一款開源深度學習框架&#xff0c;于 2016 年首次發布。它因其直觀的設計、卓越的靈活性以及強大的動態計算圖功能&#xff0c;迅速在學術界和工業界獲得了廣泛認可&#xff0c;成為當前深度學習研究…

RedisTemplate查詢不到redis中的數據問題(序列化)

RedisTemplate查詢不到redis中的數據問題(序列化) 一.問題描述 存入Redis中的值取出來卻為null,問題根本原因就是RedisTemplate和StringRedisTemplate的序列化問題、代碼示例&#xff1a; SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

【Net】TCP粘包與半包

文章目錄 TCP粘包與半包1 背景2 粘包&#xff08;packet stick&#xff09;3 半包&#xff08;packet split&#xff09;4 為什么會出現粘包/半包&#xff1f;5 如何解決&#xff1f;6 示例7 總結 TCP粘包與半包 在網絡編程中&#xff0c;粘包和半包問題是常見的 TCP 協議特有…