最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • 關(guān)于Rust?使用?dotenv?來(lái)設(shè)置環(huán)境變量的問(wèn)題

    關(guān)于Rust?使用?dotenv?來(lái)設(shè)置環(huán)境變量的問(wèn)題

    在項(xiàng)目中,我們通常需要設(shè)置一些環(huán)境變量,用來(lái)保存一些憑證或其它數(shù)據(jù),這時(shí)我們可以使用dotenv這個(gè)crate,接下來(lái)通過(guò)本文給大家介紹Rust?使用dotenv來(lái)設(shè)置環(huán)境變量的問(wèn)題,感興趣的朋友一起看看吧
    2022-01-01
  • Rust?use關(guān)鍵字妙用及模塊內(nèi)容拆分方法

    Rust?use關(guān)鍵字妙用及模塊內(nèi)容拆分方法

    這篇文章主要介紹了Rust?use關(guān)鍵字妙用|模塊內(nèi)容拆分,文中還給大家介紹use關(guān)鍵字的習(xí)慣用法,快速引用自定義模塊內(nèi)容或標(biāo)準(zhǔn)庫(kù),以此優(yōu)化代碼書(shū)寫(xiě),需要的朋友可以參考下
    2022-09-09
  • rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

    rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

    這篇文章主要為大家介紹了rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Rust中的Option枚舉快速入門(mén)教程

    Rust中的Option枚舉快速入門(mén)教程

    Rust中的Option枚舉用于表示可能不存在的值,提供了多種方法來(lái)處理這些值,避免了空指針異常,文章介紹了Option的定義、常見(jiàn)方法、使用場(chǎng)景以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法

    Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法

    Rust中的Vec是一種動(dòng)態(tài)數(shù)組,它可以在運(yùn)行時(shí)自動(dòng)調(diào)整大小,本文主要介紹了Rust動(dòng)態(tài)數(shù)組Vec基本概念及用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust中的Drop特性之解讀自動(dòng)化資源清理的魔法

    Rust通過(guò)Drop特性實(shí)現(xiàn)了自動(dòng)清理機(jī)制,確保資源在對(duì)象超出作用域時(shí)自動(dòng)釋放,避免了手動(dòng)管理資源時(shí)可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問(wèn)題,智能指針如Box、Rc和RefCell都依賴于Drop來(lái)管理資源,提供了靈活且安全的資源管理方案
    2025-02-02
  • 為什么要選Rust?學(xué)習(xí)Rust從零開(kāi)始配置和實(shí)現(xiàn)第一個(gè)簡(jiǎn)單項(xiàng)目

    為什么要選Rust?學(xué)習(xí)Rust從零開(kāi)始配置和實(shí)現(xiàn)第一個(gè)簡(jiǎn)單項(xiàng)目

    本文介紹了Rust語(yǔ)言的核心價(jià)值、應(yīng)用場(chǎng)景、開(kāi)發(fā)環(huán)境搭建、第一個(gè)Rust項(xiàng)目的創(chuàng)建與擴(kuò)展、調(diào)試、發(fā)布流程,以及新手常見(jiàn)陷阱與避坑方法,通過(guò)學(xué)習(xí)Rust,開(kāi)發(fā)者可以實(shí)現(xiàn)高效且安全的系統(tǒng)級(jí)開(kāi)發(fā)、網(wǎng)絡(luò)編程和工具開(kāi)發(fā)
    2026-01-01
  • Rust中字符串類型String的46種常用方法分享

    Rust中字符串類型String的46種常用方法分享

    Rust主要有兩種類型的字符串:&str和String,本文主要為大家介紹的是String類型的字符串以及它常用的46種方法,感興趣的小伙伴可以了解一下
    2023-06-06
  • Rust中的Iterator和IntoIterator介紹及應(yīng)用小結(jié)

    Rust中的Iterator和IntoIterator介紹及應(yīng)用小結(jié)

    Iterator即迭代器,它可以用于對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行迭代,被迭代的數(shù)據(jù)結(jié)構(gòu)是可迭代的(iterable),所謂的可迭代就是這個(gè)數(shù)據(jù)結(jié)構(gòu)有返回迭代器的方法,這篇文章主要介紹了Rust中的Iterator和IntoIterator介紹及應(yīng)用,需要的朋友可以參考下
    2023-07-07
  • Rust中的Enum與Struct示例詳解

    Rust中的Enum與Struct示例詳解

    在 Rust 中,struct(結(jié)構(gòu)體)和enum(枚舉)是兩種核心的自定義類型,分別用于組合相關(guān)數(shù)據(jù)和表示互斥的可能性,這篇文章主要介紹了Rust中的Enum與Struct示例,需要的朋友可以參考下
    2025-10-10

最新評(píng)論

腾冲县| 神农架林区| 海南省| 久治县| 永兴县| 凯里市| 久治县| 淮阳县| 南木林县| 永泰县| 三江| 连江县| 呼和浩特市| 安徽省| 博罗县| 贞丰县| 大渡口区| 当阳市| 麻栗坡县| 台东市| 图片| 定州市| 西城区| 武义县| 孙吴县| 阜宁县| 拉萨市| 海城市| 扎兰屯市| 额尔古纳市| 特克斯县| 阿图什市| 沂源县| 太和县| 大化| 中牟县| 依安县| 博客| 开远市| 镇宁| 淮安市|