rust文件读写
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编译器可以在文件不再被使用时自动关闭文件。
二、创建文件
结构体File提供了create() 函数
以只写模式打开文件。如果文件存在则清空旧内容;如果文件不存在则新建
范例
fn main() {let file = std::fs::File::create("data.txt").expect("create failed");println!("文件创建成功:{:?}",file);
}
三、读取文件
(一)结构体File实现了Read特性
Read特性提供了如下方法
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
读取一些字节到指定的缓冲区中,返回读取的字节数。读取的字节数等于缓冲区的长度
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
读取所有字节,直到此源中的 EOF 为止,然后将它们追加到 buf
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
读取所有字节,直到 EOF 为止,然后将它们追加到 buf。如果读取成功则返回读取的字节数,如果读取失败则抛出错误。
实例
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>>
将文件的全部内容读取为字节 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应用的开发。但是更多情况下文件的大小可能远超内存容量。所以不常使用。
四、写入文件
(一)结构体File实现了Write特性
Write特性提供了如下方法
fn write(&mut self, buf: &[u8]) -> Result<usize>
写入一个缓冲区,返回写入的字节数。这个函数会尝试写入 buf 的全部内容,但是整个写入可能不会成功,或者写入也会产生错误。
fn write_all(&mut self, buf: &[u8]) -> Result<()>
将整个缓冲区写入File。此方法将连续调用 write,直到没有更多数据要写入或返回非 ErrorKind::Interrupted 类型的错误为止。 在成功写入整个缓冲区或发生此类错误之前,此方法将不会返回
实例
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<()>
把一个切片写入文件,如果文件不存在就会创建文件,如果文件存在就替换其内容。
这是使用 File::create 和 write_all 的便捷函数
实例
use std::fs;
fn main() {fs::write("text.txt", "FROM RUST PROGRAM").unwrap();
}
执行程序之后,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
打开当前目录,我们可以发现文件已经被删除了。
七、复制文件
Rust标准库没有提供任何函数用于复制一个文件为另一个新文件。
但我们可以使用上面提到的函数和方法来实现文件的复制功能。
下面的代码,我们模仿简单版本的 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文件读写
std::fs模块提供了结构体File,它表示一个文件。 一、打开文件 结构体File提供了open()函数 open()以只读模式打开文件,如果文件不存在,则会抛出一个错误。如果文件不可读,那么也会抛出一个错误。 范例 fn main() {let file s…...
腾讯云我的世界mc服务器配置选择和价格表
开Minecraft我的世界服务器配置怎么选择?10人以内玩2核4G就够用了,开我的世界服务器选择轻量应用服务器就够了,腾讯云轻量应用服务器2核2G3M带宽轻量服务器一年95元,活动:txyfwq.com/go/tencent 轻量CPU采用至强白金处…...

基于安卓android微信小程序的旅游系统
项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…...

文本编辑器去除PDF水印
用文本编辑器打开pdf,搜索水印的特殊文字,全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf:...

kubernetes负载感知调度
背景 kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题, 并且很多情况下业务方都是超额申请资源,因此在原生调度器时代我们针对业务的特性以及评估等级来设置 Requests/Limit 比例来提升资源利用效率。…...

Lock使用及效率分析(C#)
针对无Lock、Lock、ReadWriterLock、ReadWriterLockSlim四种方式,测试在连续写的情况下,读取的效率(原子操作Interlocked由于使用针对int,double等修改的地方特别多,而且使用范围受限,所以本文章没有测试) …...

安卓三防平板在行业应用中有哪些优势
在工业维修和检测中,安卓三防平板的应用也十分广泛。它可以搭载各种专业软件和工具,帮助工人们进行设备故障排查和维护,降低了维修成本和停机时间。 一、产品卖点: 1. 防水性能:该手持平板采用了防水设计,…...

2015架构真题(五十)
供应链中信息流覆盖了供应商、制造商和分销商,信息流分为需求信息流和供应信息流,()属于需求信息流,()属于供应信息流。 库存记录生产计划商品入库单提货发运单 客户订单采购合同完工报告单销售…...

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串
打开vscode时发生错误:Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。 解决办法:在anaconda prompt base中输入: conda upgrade -n base -c defaults --override-channels conda...

【图像融合】差异的高斯:一种简单有效的通用图像融合方法[用于融合红外和可见光图像、多焦点图像、多模态医学图像和多曝光图像](Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
“Python+”集成技术高光谱遥感数据处理与机器学习深度应用丨高光谱数据预处理-机器学习-深度学习-图像分类-参数回归等12个专题
目录 第一章 高光谱数据处理基础 第二章 高光谱开发基础(Python) 第三章 高光谱机器学习技术(python) 第四章 典型案例操作实践 更多应用 本教程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 涵盖高光谱遥感…...

C语言_用于ADC数据的均值滤波算法
C语言_用于ADC数据的均值滤波算法 说明: 在采集ADC值的时候一般都是多次采集然后,然后取平均值,改进型做法就是去掉最大最小值剩下的再取平均值 unsigned short average(unsigned short arr[], unsigned char size) {unsigned int sum 0;for…...
【Rust基础②】流程控制、模式匹配
文章目录 4 流程控制4.1 if else表达式4.2 循环控制4.2.1 for循环4.2.2 while循环4.2.3 loop循环 5 模式匹配5.1 match和if let5.1.1 match匹配使用match表达式赋值模式绑定_通配符 5.1.2 if let 匹配5.1.3 matches! 宏 5.2 解构Option5.3 认识模式match 分支if let 分支while …...
Qt出现假死冻结现象
应用程序出现假死或冻结现象通常是由于一些常见问题所导致的。下面是一些可能的原因和解决方法: 长时间运行的任务在主线程中执行: 如果您在主线程中执行了长时间运行的任务,如文件操作、网络请求或复杂的计算,这可能导致应用程序…...

XML外部实体注入攻击XXE
xml是扩展性标记语言,来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,一般无法直接打开,可以选择用excl或记事本打…...

Hudi第三章:集成Flink
系列文章目录 Hudi第一章:编译安装 Hudi第二章:集成Spark Hudi第二章:集成Spark(二) Hudi第三章:集成Flink 文章目录 系列文章目录前言一、环境准备1.上传并解压2.修改配置文件3.拷贝jar包4.启动sql-client1.启动hadoop2.启动ses…...

MTC证书|欧盟与英国金属类产品清关新要求
从10月1日起,欧盟海关将严格检查所有申报HS代码为7323、7326等含有金属的货物,所有进口国家的金属相关产品必须提供MTC证书,证明产品材料的来源并非源自俄罗斯。 对于未使用7323、7326等含有金属类的HS编码申报,且品名未明显体现…...

保护敏感数据的艺术:数据安全指南
多年来,工程和技术迅速转型,生成和处理了大量需要保护的数据,因为网络攻击和违规的风险很高。为了保护企业数据,组织必须采取主动的数据安全方法,了解保护数据的最佳实践,并使用必要的工具和平台来实现数据…...

Commonjs与ES Module
commonjs 1 commonjs 实现原理 commonjs每个模块文件上存在 module,exports,require三个变量,然而这三个变量是没有被定义的,但是我们可以在 Commonjs 规范下每一个 js 模块上直接使用它们。在 nodejs 中还存在 __filename 和 __dirname 变…...

分布式对象存储
参考《分布式对象存储----原理、架构以及Go语言实现》(作者:胡世杰) 对象存储简介 数据的管理方式 以对象的方式管理数据,一个对象包括:对象的数据、对象的元数据、对象的全局唯一标识符 访问数据的方式 可扩展的分…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...