rust常用API,文件操作

举报
yd_254179665 发表于 2025/07/24 11:02:03 2025/07/24
【摘要】 Rust 中主要有两种字符串类型:String:可变的、动态大小的字符串类型。&str:不可变的、固定大小的字符串切片。let s1 = String::new(); // 创建一个空的 Stringlet s2 = String::from("hello"); // 从字面量创建 Stringlet s3: &str = "world"; // 创建一个字符串切片let s1 = Stri...

Rust 中主要有两种字符串类型:

  • String:可变的、动态大小的字符串类型。
  • &str:不可变的、固定大小的字符串切片。
let s1 = String::new(); // 创建一个空的 String
let s2 = String::from("hello"); // 从字面量创建 String
let s3: &str = "world"; // 创建一个字符串切片
let s1 = String::from("hello");
let s2 = String::from(" world");
let s3 = s1 + &s2; // s1 被移动,s2 作为切片引用
let s1 = String::from("hello");
let s2 = String::from("world");
let s3 = format!("{} {}", s1, s2); // 使用 format! 宏进行格式化
let s = String::from("hello world");
let slice = &s[0..5]; // 获取 "hello" 的切片
let s = String::from("hello");
for c in s.chars() {
    println!("{}", c); // 逐字符遍历
}
let arr: [i32; 5] = [1, 2, 3, 4, 5]; // 创建一个包含 5 个 i32 元素的数组
let arr2 = [0; 5]; // 创建一个包含 5 个 0 的数组

在 Rust 中,数组是固定大小的集合,类型为 [T; N],其中 T 是元素类型,N 是数组长度。数组的大小在编译时确定,因此不能动态改变大小。

fn main() {
    let arr: [i32; 3] = [1, 2, 3];
    let mut vec: Vec<i32> = arr.to_vec(); // 将数组转换为 Vec
    vec.push(4); // 插入元素
    let new_arr: [i32; 4] = vec.try_into().expect("Vec length mismatch"); // 将 Vec 转换回数组
    println!("{:?}", new_arr); // 输出 [1, 2, 3, 4]
}

可以使用 slice  concat 方法将数组切片拼接成新的数组。

fn main() {
    let arr: [i32; 3] = [1, 2, 3];
    let new_arr: [i32; 4] = [arr[0], arr[1], arr[2], 4];
    println!("{:?}", new_arr); // 输出 [1, 2, 3, 4]
}

由于元组的大小和类型是固定的,不能直接在元组中插入元素。

fn main() {
    let tuple: (i32, i32, i32) = (1, 2, 3);
    let new_tuple: (i32, i32, i32, i32) = (tuple.0, tuple.1, tuple.2, 4);
    println!("{:?}", new_tuple); // 输出 (1, 2, 3, 4)
}

除了使用 expect 方法,你还可以使用 match 表达式来处理 Result 类型的错误,这样可以更灵活地处理不同的错误情况。

fn main() {
    let arr: [i32; 3] = [1, 2, 3];
    let mut vec: Vec<i32> = arr.to_vec();
    vec.push(4); // 增加一个元素,使 vec 的长度变为 4

    match vec.try_into() {
        Ok(new_arr) => println!("{:?}", new_arr),
        Err(e) => println!("Error: {:?}", e),
    }
}

读取文件

use std::fs;
use std::io::{self, Read};

fn read_file(file_path: &str) -> io::Result<String> {
    let mut file = fs::File::open(file_path)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

fn main() -> io::Result<()> {
    let file_path = "example.txt";
    let contents = read_file(file_path)?;
    println!("File contents:\n{}", contents);
    Ok(())
}

写入文件

use std::fs::File;
use std::io::{self, Write};

fn write_file(file_path: &str, content: &str) -> io::Result<()> {
    let mut file = File::create(file_path)?;
    file.write_all(content.as_bytes())?;
    Ok(())
}

fn main() -> io::Result<()> {
    let file_path = "example.txt";
    let content = "Hello, Rust!";
    write_file(file_path, content)?;
    println!("File written successfully");
    Ok(())
}

在 Rust 中,Result 是一个枚举类型,用于表示可能成功或失败的操作。Result 有两个变体:

  • Ok(T):表示操作成功,包含成功的结果值 T
  • Err(E):表示操作失败,包含错误值 E

在 Rust 中,() 是一个单元类型(unit type),表示没有值。它通常用于表示函数没有返回值,或者表示一个操作成功但没有返回任何有用的结果。

use std::fs::File;
use std::io::{self, Write};

fn write_file(file_path: &str, content: &str) -> io::Result<()> {
    let mut file = File::create(file_path)?;
    file.write_all(content.as_bytes())?;
    Ok(())
}

fn main() -> io::Result<()> {
    let file_path = "example.txt";
    let content = "Hello, Rust!";
    write_file(file_path, content)?;
    println!("File written successfully");
    Ok(())
}

Rust 中的异常处理主要通过 Result  Option 类型来实现。Result 用于表示可能失败的操作,Option 用于表示可能不存在的值。

? 操作符用于简化错误处理。当一个表达式返回 Result 或 Option 类型时,? 操作符会自动处理 Err 或 None,并提前返回错误。例如:

use std::fs::File;
use std::io::{self, Read};

fn read_file(file_path: &str) -> io::Result<String> {
    let mut file = File::open(file_path)?;
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
    Ok(contents)
}

fn main() -> io::Result<()> {
    let file_path = "example.txt";
    let contents = read_file(file_path)?;
    println!("File contents:\n{}", contents);
    Ok(())
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。