亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

rust文件讀寫(xiě)的實(shí)現(xiàn)示例

 更新時(shí)間:2023年12月07日 11:29:22   作者:int8  
Rust語(yǔ)言提供了強(qiáng)大的文件讀寫(xiě)庫(kù),使得開(kāi)發(fā)者可以更加方便地進(jìn)行文件操作,并且其安全性可以有效避免文件操作中可能出現(xiàn)的風(fēng)險(xiǎn),本文就來(lái)詳細(xì)的介紹了rust文件讀寫(xiě)的實(shí)現(xiàn)示例,感興趣的可以了解一下

std::fs模塊提供了結(jié)構(gòu)體File,它表示一個(gè)文件。

一、打開(kāi)文件

結(jié)構(gòu)體File提供了open()函數(shù)
open()以只讀模式打開(kāi)文件,如果文件不存在,則會(huì)拋出一個(gè)錯(cuò)誤。如果文件不可讀,那么也會(huì)拋出一個(gè)錯(cuò)誤。

范例

fn main() {
     let file = std::fs::File::open("data.txt").unwrap();
     println!("文件打開(kāi)成功:{:?}", file);
}

std::fs::File的open函數(shù)沒(méi)有配套的close函數(shù),因?yàn)镽ust編譯器可以在文件不再被使用時(shí)自動(dòng)關(guān)閉文件。

二、創(chuàng)建文件

結(jié)構(gòu)體File提供了create() 函數(shù)
以只寫(xiě)模式打開(kāi)文件。如果文件存在則清空舊內(nèi)容;如果文件不存在則新建

范例

fn main() {
     let file = std::fs::File::create("data.txt").expect("create failed");
     println!("文件創(chuàng)建成功:{:?}",file);
}

三、讀取文件

(一)結(jié)構(gòu)體File實(shí)現(xiàn)了Read特性
Read特性提供了如下方法

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

讀取一些字節(jié)到指定的緩沖區(qū)中,返回讀取的字節(jié)數(shù)。讀取的字節(jié)數(shù)等于緩沖區(qū)的長(zhǎng)度

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>

讀取所有字節(jié),直到此源中的 EOF 為止,然后將它們追加到 buf

fn read_to_string(&mut self, buf: &mut String) -> Result<usize>

讀取所有字節(jié),直到 EOF 為止,然后將它們追加到 buf。如果讀取成功則返回讀取的字節(jié)數(shù),如果讀取失敗則拋出錯(cuò)誤。

實(shí)例

use std::io::prelude::*;
use std::fs;
fn main() {
    let mut buffer = [0u8; 5];
    let mut file = fs::File::open("text.txt").unwrap();
    file.read(&mut buffer).unwrap();
    println!("{:?}", buffer);
    file.read(&mut buffer).unwrap();
    println!("{:?}", buffer);
}
運(yùn)行結(jié)果:
[84, 104, 105, 115, 32]
[105, 115, 32, 97, 32]

范例

data.txt內(nèi)容如下

簡(jiǎn)單教程
簡(jiǎn)單編程

代碼如下

use std::io::Read;
fn main(){
     let mut file = std::fs::File::open("data.txt").unwrap();
     let mut contents = String::new();
     file.read_to_string(&mut contents).unwrap();
     println!("{}", contents);
}

運(yùn)行結(jié)果如下

簡(jiǎn)單教程
簡(jiǎn)單編程

(二)快捷函數(shù)

std::fs::read_to_string

pub fn read_to_string<P: AsRef<Path>>(path: P) -> Result<String>

將文件的全部?jī)?nèi)容讀取為字符串。這是使用File::open和File::read_to_string 的便捷函數(shù)

實(shí)例

use std::fs;
fn main() {
    let text = fs::read_to_string("text.txt").unwrap();
    println!("{}", text);
}
運(yùn)行結(jié)果:
This is a text file.

std::fs::read

pub fn read<P: AsRef<Path>>(path: P) -> Result<Vec<u8>>

將文件的全部?jī)?nèi)容讀取為字節(jié) vector。這是使用 File::open 和 read_to_end 的便捷函數(shù)

實(shí)例

use std::fs;
fn main() {
    let content = fs::read("D:\\text.txt").unwrap();
    println!("{:?}", content);
}
運(yùn)行結(jié)果:
[84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 120, 116, 32, 102, 105, 108, 101, 46]

以上兩種方式是一次性讀取,十分適合Web應(yīng)用的開(kāi)發(fā)。但是更多情況下文件的大小可能遠(yuǎn)超內(nèi)存容量。所以不常使用。

四、寫(xiě)入文件

(一)結(jié)構(gòu)體File實(shí)現(xiàn)了Write特性
Write特性提供了如下方法

fn write(&mut self, buf: &[u8]) -> Result<usize>

寫(xiě)入一個(gè)緩沖區(qū),返回寫(xiě)入的字節(jié)數(shù)。這個(gè)函數(shù)會(huì)嘗試寫(xiě)入 buf 的全部?jī)?nèi)容,但是整個(gè)寫(xiě)入可能不會(huì)成功,或者寫(xiě)入也會(huì)產(chǎn)生錯(cuò)誤。

fn write_all(&mut self, buf: &[u8]) -> Result<()>

將整個(gè)緩沖區(qū)寫(xiě)入File。此方法將連續(xù)調(diào)用 write,直到?jīng)]有更多數(shù)據(jù)要寫(xiě)入或返回非 ErrorKind::Interrupted 類型的錯(cuò)誤為止。 在成功寫(xiě)入整個(gè)緩沖區(qū)或發(fā)生此類錯(cuò)誤之前,此方法將不會(huì)返回

實(shí)例

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

范例

use std::io::Write;
fn main() {
     let mut file = std::fs::File::create("data.txt").expect("create failed");
     file.write_all("簡(jiǎn)單教程".as_bytes()).expect("write failed");
     file.write_all("\n簡(jiǎn)單編程".as_bytes()).expect("write failed");
     println!("data written to file" );
}
編譯運(yùn)行,則data.txt的內(nèi)容如下
簡(jiǎn)單教程
簡(jiǎn)單編程

(二)快捷函數(shù)
std::fs::write

pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> Result<()>

把一個(gè)切片寫(xiě)入文件,如果文件不存在就會(huì)創(chuàng)建文件,如果文件存在就替換其內(nèi)容。
這是使用 File::create 和 write_all 的便捷函數(shù)

實(shí)例

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

執(zhí)行程序之后,text.txt文件的內(nèi)容將會(huì)被重寫(xiě)為FROM RUST PROGRAM。

五、追加內(nèi)容到文件末尾

Write特性并沒(méi)有提供函數(shù)用于追加內(nèi)容
但std::fs::OpenOptions結(jié)構(gòu)體,可以配置文件打開(kāi)方式。
OpenOptions提供了append()用于設(shè)置追加模式

pub fn append(&mut self, append: bool) -> &mut Self

當(dāng)文件的模式設(shè)置為 追加 之后,寫(xiě)入文件的內(nèi)容就不會(huì)代替原先的舊內(nèi)容而是放在舊內(nèi)容的后面。

范例

data.txt內(nèi)容如下
簡(jiǎn)單教程
簡(jiǎn)單編程

代碼如下
use std::fs::OpenOptions;
use std::io::Write;
fn main() {
     let mut file = OpenOptions::new().append(true).open("data.txt").expect("cannot open file");
     file.write_all("www.twle.cn".as_bytes()).expect("write failed");
     file.write_all("\n簡(jiǎn)單教程".as_bytes()).expect("write failed");
     file.write_all("\n簡(jiǎn)單編程".as_bytes()).expect("write failed");
     println!("數(shù)據(jù)追加成功");
}
運(yùn)行結(jié)果如下
數(shù)據(jù)追加成功

打開(kāi)  data.txt  文件,可以看到內(nèi)容如下
簡(jiǎn)單教程
簡(jiǎn)單編程www.twle.cn
簡(jiǎn)單教程
簡(jiǎn)單編程

OpenOptions除append權(quán)限以外還有read權(quán)限和write權(quán)限,如果我們想以讀寫(xiě)權(quán)限打開(kāi)一個(gè)文件可以這樣寫(xiě)

實(shí)例

text.txt內(nèi)容如下
this is text

代碼如下
use std::io::prelude::*;
use std::fs::OpenOptions;
fn main() -> std::io::Result<()> {
    let mut file = OpenOptions::new().read(true).write(true).open("text.txt")?;
    file.write(b"COVER")?;
    Ok(())
}
運(yùn)行之后,text.txt文件內(nèi)容將變成:
COVERis text

六、刪除文件

std::fs 提供了函數(shù) remove_file() 用于刪除文件。

pub fn remove_file<P: AsRef>(path: P) -> Result<()>

注意,刪除可能會(huì)失敗,即使返回結(jié)果為OK,也有可能不會(huì)立即就刪除。

范例

use std::fs;
fn main() {
     fs::remove_file("data.txt").expect("could not remove file");
     println!("file is removed");
}
編譯運(yùn)行結(jié)果如下
file is removed

打開(kāi)當(dāng)前目錄,我們可以發(fā)現(xiàn)文件已經(jīng)被刪除了。

七、復(fù)制文件

Rust標(biāo)準(zhǔn)庫(kù)沒(méi)有提供任何函數(shù)用于復(fù)制一個(gè)文件為另一個(gè)新文件。
但我們可以使用上面提到的函數(shù)和方法來(lái)實(shí)現(xiàn)文件的復(fù)制功能。
下面的代碼,我們模仿簡(jiǎn)單版本的 copy 命令

copy old_file_name new_file_name

代碼如下

use std::io::Read;
use std::io::Write;
fn main() {
     let mut command_line: std::env::Args = std::env::args();
     command_line.next().unwrap();     // 跳過(guò)程序名
     // 原文件
     let source = command_line.next().unwrap();
     // 新文件
     let destination = command_line.next().unwrap();
     let mut file_in = std::fs::File::open(source).unwrap();
     let mut file_out = std::fs::File::create(destination).unwrap();
     let mut buffer = [0u8; 4096];
     loop {
         let nbytes = file_in.read(&mut buffer).unwrap();
         file_out.write(&buffer[..nbytes]).unwrap();
         if nbytes < buffer.len() { break; }
     }
}
$ ./main data.txt data_new.txt

data.txt 為我們想要復(fù)制的原文件路徑
data_new.txt 為我們想要的新文件路徑

到此這篇關(guān)于rust文件讀寫(xiě)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)rust文件讀寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust?duckdb和polars讀csv文件比較情況

    Rust?duckdb和polars讀csv文件比較情況

    duckdb在數(shù)據(jù)分析上,有非常多不錯(cuò)的特質(zhì),1、快;2、客戶體驗(yàn)好,特別是可以同時(shí)批量讀csv在一個(gè)目錄下的csv等文件,今天來(lái)比較下Rust?duckdb和polars讀csv文件比較的情況,感興趣的朋友一起看看吧
    2024-06-06
  • 一文弄懂Rust之切片

    一文弄懂Rust之切片

    在Rust中,切片是一種非常重要的引用類型,它允許你安全地引用一段連續(xù)內(nèi)存中的數(shù)據(jù),而不需要擁有這些數(shù)據(jù)的所有權(quán),本文主要介紹了Rust之切片,感興趣的可以了解一下
    2024-03-03
  • Rust 多線程編程的實(shí)現(xiàn)

    Rust 多線程編程的實(shí)現(xiàn)

    在rust中,多線程編程不算困難,但是也需要留心和別的編程語(yǔ)言中不同的地方,本文主要介紹了Rust 多線程編程的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐

    Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐

    Rust標(biāo)準(zhǔn)庫(kù)中并沒(méi)有隨機(jī)數(shù)生成器,常見(jiàn)的解決方案是使用rand包,本文主要介紹了Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 淺談Rust中聲明可見(jiàn)性

    淺談Rust中聲明可見(jiàn)性

    在Rust編程語(yǔ)言中,聲明可見(jiàn)性是一個(gè)核心概念,本文主要介紹了Rust中聲明可見(jiàn)性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 詳解Rust中的變量與常量

    詳解Rust中的變量與常量

    大多數(shù)嘗試過(guò) Rust 的人都希望繼續(xù)使用它。但是如果你沒(méi)有使用過(guò)它,你可能會(huì)想——什么是 Rust,如何理解Rust中的變量與常量,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • Rust中GUI庫(kù)egui的簡(jiǎn)單應(yīng)用指南

    Rust中GUI庫(kù)egui的簡(jiǎn)單應(yīng)用指南

    egui(發(fā)音為“e-gooey”)是一個(gè)簡(jiǎn)單、快速且高度可移植的 Rust 即時(shí)模式 GUI 庫(kù),跨平臺(tái)、Rust原生,適合一些小工具和游戲引擎GUI,下面就跟隨小編一起來(lái)看看它的具體使用吧
    2024-03-03
  • Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Rust中的Cargo構(gòu)建、運(yùn)行、調(diào)試

    Cargo是rustup安裝后自帶的,Cargo?是?Rust?的構(gòu)建系統(tǒng)和包管理器,這篇文章主要介紹了Rust之Cargo構(gòu)建、運(yùn)行、調(diào)試,需要的朋友可以參考下
    2022-09-09
  • Rust中的不安全代碼詳解

    Rust中的不安全代碼詳解

    這篇文章主要為大家介紹了Rust中的不安全代碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 使用Rust語(yǔ)言管理Node.js版本

    使用Rust語(yǔ)言管理Node.js版本

    這篇文章主要介紹一個(gè)使用?Rust?進(jìn)行編寫(xiě)的一體化版本管理工具?Rtx,比如使用它來(lái)管理?Node.js?版本,它很簡(jiǎn)單易用,使用了它,就可以拋棄掉?nvm?了,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評(píng)論