欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

一、打開文件

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

范例

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

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

二、創(chuàng)建文件

結(jié)構(gòu)體File提供了create() 函數(shù)
以只寫模式打開文件。如果文件存在則清空舊內(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ū)的長度

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)容如下

簡單教程
簡單編程

代碼如下

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é)果如下

簡單教程
簡單編程

(二)快捷函數(shù)

std::fs::read_to_string

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

將文件的全部內(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>>

將文件的全部內(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)用的開發(fā)。但是更多情況下文件的大小可能遠(yuǎn)超內(nèi)存容量。所以不常使用。

四、寫入文件

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

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

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

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

將整個(gè)緩沖區(qū)寫入File。此方法將連續(xù)調(diào)用 write,直到?jīng)]有更多數(shù)據(jù)要寫入或返回非 ErrorKind::Interrupted 類型的錯(cuò)誤為止。 在成功寫入整個(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("簡單教程".as_bytes()).expect("write failed");
     file.write_all("\n簡單編程".as_bytes()).expect("write failed");
     println!("data written to file" );
}
編譯運(yùn)行,則data.txt的內(nèi)容如下
簡單教程
簡單編程

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

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

把一個(gè)切片寫入文件,如果文件不存在就會(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ì)被重寫為FROM RUST PROGRAM。

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

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

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

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

范例

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

代碼如下
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簡單教程".as_bytes()).expect("write failed");
     file.write_all("\n簡單編程".as_bytes()).expect("write failed");
     println!("數(shù)據(jù)追加成功");
}
運(yùn)行結(jié)果如下
數(shù)據(jù)追加成功

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

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

實(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

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

七、復(fù)制文件

Rust標(biāo)準(zhǔn)庫沒有提供任何函數(shù)用于復(fù)制一個(gè)文件為另一個(gè)新文件。
但我們可以使用上面提到的函數(shù)和方法來實(shí)現(xiàn)文件的復(fù)制功能。
下面的代碼,我們模仿簡單版本的 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();     // 跳過程序名
     // 原文件
     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文件讀寫的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)rust文件讀寫內(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等文件,今天來比較下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中,多線程編程不算困難,但是也需要留心和別的編程語言中不同的地方,本文主要介紹了Rust 多線程編程的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐

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

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

    淺談Rust中聲明可見性

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

    詳解Rust中的變量與常量

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

    Rust中GUI庫egui的簡單應(yīng)用指南

    egui(發(fā)音為“e-gooey”)是一個(gè)簡單、快速且高度可移植的 Rust 即時(shí)模式 GUI 庫,跨平臺(tái)、Rust原生,適合一些小工具和游戲引擎GUI,下面就跟隨小編一起來看看它的具體使用吧
    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語言管理Node.js版本

    使用Rust語言管理Node.js版本

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

最新評(píng)論