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语言实现》(作者:胡世杰) 对象存储简介 数据的管理方式 以对象的方式管理数据,一个对象包括:对象的数据、对象的元数据、对象的全局唯一标识符 访问数据的方式 可扩展的分…...
2025.12晶晨S905L3S-L3SB安卓9通刷实战:当贝桌面加持,解锁多品牌盒子新玩法
1. 晶晨S905L3S-L3SB通刷包的前世今生 第一次听说晶晨S905L3S-L3SB芯片能通刷时,我正对着家里三台不同品牌的电视盒子发愁。这些盒子有的来自运营商赠送,有的是二手市场淘来的,虽然硬件配置相近,但系统体验天差地别。直到发现这个…...
5大核心功能解密:douyin-downloader抖音下载器实战指南
5大核心功能解密:douyin-downloader抖音下载器实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型
保姆级教程:在Windows系统本地部署Qwen3-14B-Int4-AWQ对话模型 1. 前言:为什么选择本地部署? 在个人电脑上运行大语言模型听起来可能有些遥不可及,但随着模型量化技术的进步,现在即使是消费级显卡也能流畅运行14B参数…...
MagiskHide Props Config:设备属性管理的3大维度与安全检测绕过全指南
MagiskHide Props Config:设备属性管理的3大维度与安全检测绕过全指南 【免费下载链接】MagiskHidePropsConf This tool is now dead... 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskHidePropsConf 一、价值定位:为什么每个root用户都需要…...
基于SpringBoot+Vue的月度员工绩效考核管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
摘要 现代企业管理中,绩效考核是提升员工工作效率、优化人力资源配置的重要手段。传统的绩效考核多依赖纸质记录或简单的电子表格,存在数据易丢失、统计效率低、反馈周期长等问题。随着信息化技术的发展,企业亟需一套高效、精准的绩效考核管理…...
崖山数据库-谓词没提前过滤优化器BUG
数据库版本崖山23.5.1 SQL> select * from v$version;BANNER VERSION_NUMBER ---------------------------------------------------------------- ----------------- Enterprise Edition Release 23.5.1.1…...
uniapp 如何实现google登录-安卓端
uniapp 如何实现google登录-安卓端 本文只讲解uniapp安卓端如何获取到idToken来实现登录,ios使用uniapp官方方法可以获取 海外app貌似最常用的就是邮箱登录,在app上表现出来最常用的就是谷歌一键登录,或者邮箱加网页验证;google登…...
DanKoe 视频笔记:创作者指南:如何摆脱新手地狱
在本教程中,我们将学习创作者如何突破最初的停滞期,即所谓的“新手地狱”。我们将探讨导致这一困境的核心原因,并提供一系列具体、可操作的策略,帮助你建立权威、创作吸引人的内容、有效建立网络,并最终构建可持续的个…...
Umi-OCR服务化集成解决方案:将离线OCR能力无缝嵌入你的技术栈
Umi-OCR服务化集成解决方案:将离线OCR能力无缝嵌入你的技术栈 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件,适用于Windows系统,支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.c…...
避坑指南:在FPGA上实现DP SST协议时,最容易搞错的BS/SR时序与填充规则
FPGA实战避坑:DP SST协议中BS/SR时序与填充规则的7个致命误区 DisplayPort单流传输(SST)协议在FPGA实现过程中,那些看似简单的BS(Blanking Start)和SR(Scrambler Reset)时序规则,往往成为视频流异常的罪魁祸首。去年在为某8K视频采集卡调试DP…...
