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

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

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

std::fs模塊提供了結構體File,它表示一個文件。

一、打開文件

結構體File提供了open()函數
open()以只讀模式打開文件,如果文件不存在,則會拋出一個錯誤。如果文件不可讀,那么也會拋出一個錯誤。

范例

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

std::fs::File的open函數沒有配套的close函數,因為Rust編譯器可以在文件不再被使用時自動關閉文件。

二、創(chuàng)建文件

結構體File提供了create() 函數
以只寫模式打開文件。如果文件存在則清空舊內容;如果文件不存在則新建

范例

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

三、讀取文件

(一)結構體File實現(xiàn)了Read特性
Read特性提供了如下方法

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

讀取一些字節(jié)到指定的緩沖區(qū)中,返回讀取的字節(jié)數。讀取的字節(jié)數等于緩沖區(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é)數,如果讀取失敗則拋出錯誤。

實例

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);
}
運行結果:
[84, 104, 105, 115, 32]
[105, 115, 32, 97, 32]

范例

data.txt內容如下

簡單教程
簡單編程

代碼如下

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);
}

運行結果如下

簡單教程
簡單編程

(二)快捷函數

std::fs::read_to_string

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

將文件的全部內容讀取為字符串。這是使用File::open和File::read_to_string 的便捷函數

實例

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

std::fs::read

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

將文件的全部內容讀取為字節(jié) vector。這是使用 File::open 和 read_to_end 的便捷函數

實例

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

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

四、寫入文件

(一)結構體File實現(xiàn)了Write特性
Write特性提供了如下方法

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

寫入一個緩沖區(qū),返回寫入的字節(jié)數。這個函數會嘗試寫入 buf 的全部內容,但是整個寫入可能不會成功,或者寫入也會產生錯誤。

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

將整個緩沖區(qū)寫入File。此方法將連續(xù)調用 write,直到沒有更多數據要寫入或返回非 ErrorKind::Interrupted 類型的錯誤為止。 在成功寫入整個緩沖區(qū)或發(fā)生此類錯誤之前,此方法將不會返回

實例

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" );
}
編譯運行,則data.txt的內容如下
簡單教程
簡單編程

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

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

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

實例

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

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

五、追加內容到文件末尾

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

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

當文件的模式設置為 追加 之后,寫入文件的內容就不會代替原先的舊內容而是放在舊內容的后面。

范例

data.txt內容如下
簡單教程
簡單編程

代碼如下
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!("數據追加成功");
}
運行結果如下
數據追加成功

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

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

實例

text.txt內容如下
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(())
}
運行之后,text.txt文件內容將變成:
COVERis text

六、刪除文件

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

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

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

范例

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

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

七、復制文件

Rust標準庫沒有提供任何函數用于復制一個文件為另一個新文件。
但我們可以使用上面提到的函數和方法來實現(xià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();     // 跳過程序名
     // 原文件
     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 為我們想要復制的原文件路徑
data_new.txt 為我們想要的新文件路徑

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

相關文章

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

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

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

    一文弄懂Rust之切片

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

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

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

    Rust生成隨機數的項目實踐

    Rust標準庫中并沒有隨機數生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機數的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 淺談Rust中聲明可見性

    淺談Rust中聲明可見性

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

    詳解Rust中的變量與常量

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

    Rust中GUI庫egui的簡單應用指南

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

    Rust中的Cargo構建、運行、調試

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

    Rust中的不安全代碼詳解

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

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

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

最新評論