当前位置: 首页 > news >正文

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&#xff0c;它表示一个文件。 一、打开文件 结构体File提供了open()函数 open()以只读模式打开文件&#xff0c;如果文件不存在&#xff0c;则会抛出一个错误。如果文件不可读&#xff0c;那么也会抛出一个错误。 范例 fn main() {let file s…...

腾讯云我的世界mc服务器配置选择和价格表

开Minecraft我的世界服务器配置怎么选择&#xff1f;10人以内玩2核4G就够用了&#xff0c;开我的世界服务器选择轻量应用服务器就够了&#xff0c;腾讯云轻量应用服务器2核2G3M带宽轻量服务器一年95元&#xff0c;活动&#xff1a;txyfwq.com/go/tencent 轻量CPU采用至强白金处…...

基于安卓android微信小程序的旅游系统

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

文本编辑器去除PDF水印

用文本编辑器打开pdf&#xff0c;搜索水印的特殊文字&#xff0c;全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf&#xff1a;...

kubernetes负载感知调度

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

Lock使用及效率分析(C#)

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

安卓三防平板在行业应用中有哪些优势

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

2015架构真题(五十)

供应链中信息流覆盖了供应商、制造商和分销商&#xff0c;信息流分为需求信息流和供应信息流&#xff0c;&#xff08;&#xff09;属于需求信息流&#xff0c;&#xff08;&#xff09;属于供应信息流。 库存记录生产计划商品入库单提货发运单 客户订单采购合同完工报告单销售…...

VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

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

【图像融合】差异的高斯:一种简单有效的通用图像融合方法[用于融合红外和可见光图像、多焦点图像、多模态医学图像和多曝光图像](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用丨高光谱数据预处理-机器学习-深度学习-图像分类-参数回归等12个专题

目录 第一章 高光谱数据处理基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 更多应用 本教程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 涵盖高光谱遥感…...

C语言_用于ADC数据的均值滤波算法

C语言_用于ADC数据的均值滤波算法 说明&#xff1a; 在采集ADC值的时候一般都是多次采集然后&#xff0c;然后取平均值&#xff0c;改进型做法就是去掉最大最小值剩下的再取平均值 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出现假死冻结现象

应用程序出现假死或冻结现象通常是由于一些常见问题所导致的。下面是一些可能的原因和解决方法&#xff1a; 长时间运行的任务在主线程中执行&#xff1a; 如果您在主线程中执行了长时间运行的任务&#xff0c;如文件操作、网络请求或复杂的计算&#xff0c;这可能导致应用程序…...

XML外部实体注入攻击XXE

xml是扩展性标记语言&#xff0c;来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;一般无法直接打开&#xff0c;可以选择用excl或记事本打…...

Hudi第三章:集成Flink

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

MTC证书|欧盟与英国金属类产品清关新要求

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

保护敏感数据的艺术:数据安全指南

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

Commonjs与ES Module

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

分布式对象存储

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

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...