Rust语言基础 命令行 输出 1 2 3 4 5 fn main (){ let a =12 ; println! ("a is {0}, a again is {0}" ,a); println! ("{{}}" ); }
详细输出 1 2 3 4 5 6 7 8 9 #[derive(Debug)] struct Rectangle { width:u32 , height:u32 , } fn main (){ let rect1 =Rectangle{width:30 ,height:50 }; println! ("rect1 is {:?}" ,rect1); }
命令行输入 1 2 3 4 5 6 use std::io::stdin;fn main (){ let mut str_buf =String ::new (); stdin ().read_line (&mut str_buff).unwrap (); printfln!("{}" ,str_buf); }
示例:
1 2 3 4 5 6 7 8 9 10 use std::io::stdin;fn main (){ let mut str_buf =String ::new (); stdin ().read_line (&mut str_buf).unwrap (); let sp :Vec <&str >=str_buf.as_str ().split (' ' ).collect (); let a =sp[0 ].trim ().parse::<i32 >().unwrap (); let b =sp[1 ].trim ().parse::<i32 >().unwrap (); println! ("{}+{}={}" ,a,b,a+b); }
命令行传参 法一:
1 2 3 4 5 6 fn main (){ let args =std::env::args (); for arg in args{ println! ("{}" ,arg) } }
法二:
1 2 3 4 5 6 7 fn main (){ let mut args =std::env::args (); args.next (); let a =args.next ().unwrap ().trim ().parse<i32 >().unwrap (); let b =args.next ().unwrap ().trim ().parse<i32 >().unwrap (); println! ("{}+{}={}" ,a,b,a+b); }
基础语法 变量 1 2 3 4 5 6 7 8 9 10 11 12 let a =123 ;let a :i32 =123 ;let mut a =123 ;let a ;a=456 ; let x =5 ;let x =x+1 ;let x =x*2 ;
静态变量 1 2 3 4 static a:i32 =123 ;fn main (){ println! ("{}" ,a); }
直接修改静态变量的值:
1 2 3 4 5 6 7 static mut VAR:i32 =123 ;fn main (){ unsafe { VAR=456 ; println! ("{}" ,VAR); } }
数据类型 整数型 浮点型 布尔型 字符型 1 2 3 4 5 6 7 8 9 10 11 12 i8 u8 i16 u16 i32 u32 i64 u64 i128 u128 isize usize f64 f32 bool char
字符串 String
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let string =String ::from ("Some string" );let mut string =String ::from ("" );string.push ('A' ); string.push_str ("QWER" ); String ::from ("Hello你好" ).len ();let a =String ::from ("..." );let b =String ::from ("..." );let result =a.eq (&b);String ::from ("..." ).eq ("..." );String ::from ("..." ).eq (String ::from ("..." ).as_str ());let s :String =String ::from ("RUNOOB" );let ch :char =s.chars ().nth (2 ).unwrap ();let sub :&str =&s[0 ..3 ];
其实&str比String好使:
1 2 3 4 fn main (){ let s :&str ="RUNOOB" ; println! ("{}{}{}{}" ,s.len (),s.eq ("RUNOOB" ),s.chars ().nth (2 ).unwarp (),&s[0 ..3 ]); }
元组 1 2 3 4 5 6 7 8 9 let tup =(500 ,6.4 ,1 );let tup :(i32 ,f64 ,i32 )=(500 ,6.4 ,1 );fn main (){ let tup :(i32 ,f64 ,i32 )=(500 ,6.4 ,1 ); println! ("{}" ,tup.0 ); let (x,y,z)=tup; println! ("{}" ,x); }
数组 1 2 3 4 5 6 7 8 let a =[1 ,2 ,3 ,4 ,5 ];let length =a.len ();let b =["January" ,"Febrary" ,"March" ];let c :[i32 ;5 ]=[1 ,2 ,3 ,4 ,5 ];let d =[3 ;5 ];let first =a[0 ];let mut a =[1 ,2 ,3 ,4 ,5 ]a[0 ]=0 ;
函数 声明 1 2 3 4 5 6 7 fn addition (a:i32 ,b:i32 )-> i32 { return a+b; } fn main (){ let sum =addition (100 ,23 ); println! ("{}" ,sum); }
函数表达式 1 2 3 4 5 6 7 8 9 fn main (){ let x =4 ; let y ={ let a =x*x*x; let b =2 *x*x; a+b+3 }; println! ("{}" ,y); }
函数对象 1 2 3 4 5 6 7 8 9 10 11 12 13 fn function_one (){ println! ("Funtion1" ); } fn function_two (){ println! ("Function2" ); } fn main (){ let mut fun :fn (); fun=function_one; fun (); fun=function_two; fun (); }
闭包/Lambda表达式/匿名函数 1 2 3 4 5 6 fn main (){ let fun =|x:i32 |-> i32 { return x+1 ; }; println! ("{}" ,fun (1 )); }
条件语句 if-else 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 fn main (){ let number =3 ; if number<5 { println! ("{}" ,number); }else { println! ("{}" ,number); } } fn main (){ let score =100 ; if score>90 { println! ("..." ); }else if score>60 { println! ("..." ); } }
三元运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fn main (){ let a =3 ; let number =if a>0 {1 } else {-1 }; } fn main (){ let score =86 ; let branch =if score>90 { "..." }else if score>80 { ",,," }else { "..." }; }
match 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fn main (){ let op =1 ; match op{ 0 =>{ println! ("op=0" ); }, 1 |2 |3 |4 |5 =>{ println! ("..." ); }, _=>{ println! ("default" ); } } }
循环结构 while 1 2 3 4 5 6 fn main (){ let mut number =1 ; while number<4 { number+=1 ; } }
for 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 fn main (){ for i in 1 ..5 { println! ("{}" ,i); } } fn main (){ let a =[10 ,20 ,30 ,40 ,50 ]; for i in a.iter (){ println! ("{}" ,i); } } fn main (){ let a =[10 ,20 ,30 ,40 ,50 ]; for i in 0 ..a.len (){ println! ("a[{}]={}" ,i,a[i]); } }
loop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 fn main (){ let s =['R' ,'U' ,'N' ,'O' ,'O' ,'B' ]; let mut i =0 ; loop { let ch =s[i]; if ch=='O' { break ; } print! ("{}" ,ch); i+=1 ; } } fn main (){ let s =['R' ,'U' ,'N' ,'O' ,'O' ,'B' ]; let mut i =0 ; let location =loop { let ch =s[i]; if ch=='O' { break i; } i+=1 ; }; println! ("{}" ,location); }
所有权 参数所有权 所有权转移与复制:
1 2 3 4 5 6 7 8 9 10 11 12 fn main (){ let s =String ::from ("Hello" ); takes_ownership (s); let x =5 ; makes_copy (x); } fn takes_ownership (some_string:String ){ println! ("{}" ,some_string); } fn makes_copy (some_integer:i32 ){ println! ("{}" ,some_integer); }
原子类型所有权借用:
1 2 3 4 5 6 7 8 fn main (){ let s =String ::from ("hello" ); reference (&s); println! ("主函数{}" ,s); } fn reference (some_string:&String ){ println! ("子函数{}" ,some_string); }
返回值所有权 1 2 3 4 5 6 7 8 9 10 11 12 fn main (){ let s1 =gives_ownership (); let s2 =String ::from ("hello" ); let s3 =takes_and_gives_back (s2); } fn gives_ownership ()-> String { let some_string =String ::from ("hello" ); return some_string; } fn takes_and_gives_back (a_string:String )-> String { return a_string; }
引用 获取修改权:
1 2 3 4 5 6 7 8 fn main (){ let mut s1 =String ::from ("String;" ); add_suffix (&mut s1); println! ("{}" ,s1); } fn add_suffix (s:&mut String ){ s.push_str ("SUFFIX" ); }
可变变量被不可变借用后,该引用的生命周期结束前不能存在任何借用:
1 2 3 4 5 fn main (){ let mut s1 =String ::from ("1" ); let r =&s1; s1.push_str ("2" ); }
变量被可变借用,在引用的生命周期结束前不能存在任何其他借用:
1 2 3 4 5 fn main (){ let mut s1 =String ::from ("1" ); let r1 =&mut s1; let r2 =&s1; }
解引用 1 2 3 4 5 6 7 8 9 10 11 fn swap (a:&mut i32 ,b:&mut i32 ){ let t =*a; *a=*b; *b=t; } fn main (){ let mut a =0 ; let mut b =1 ; swap (&mut a,&mut b);+ println! ("a={}b={}" ,a,b); }
切片类型 字符串切片 1 2 3 4 5 6 fn main (){ let s :String =String ::from ("broadcast" ); let part1 :&str =&s[0 ..5 ]; let part2 :&str =&s[5 ..9 ]; println! ("{}={}+{}" ,s,part1,part2); }
数组切片 1 2 3 4 5 6 7 fn main (){ let arr :[i32 ;5 ]=[0 ,1 ,2 ,3 ,4 ]; let part :&[i32 ]=&arr[1 ..3 ]; for i in part.iter (){ println! ("{}" ,i); } }
复合类型 结构体 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 struct Site { domain:String , name:String , natin:String } let runoob =Site{ domain:String ::from ("aaa" ), name:String ::from ("bbb" ), nation:String ::from ("ccc" ) }; let domain =String ::from ("xxx" );let bing =Site{ domain, name:String ::from ("aaa" ), ..runoob }
生命周期显性注释:
1 2 3 4 5 6 7 fn longer <'a >(s1:&'a str ,s2:&'a str )-> &'a str { if s2.len ()>s1.len (){ return s2; }else { return s1; } }
结构体方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 struct Rectangle { width:u32 , height:u32 , } impl Rectangle { fn wider (&self ,rect:&Rectangle)-> bool { self .width>rect.width } } fn main (){ let rect1 =Rectangle{width:30 ,height:50 }; let rect2 =Rectangle{width:40 ,height:20 }; println! ("{}" ,rect.wider (rect2)); }
元组结构体 1 2 3 4 5 fn main (){ struct Color (u8 .u8 ,u8 ); let black =Color (0 ,0 ,0 ); println! ("{},{},{}" ,black.0 ,black.1 ,black.2 ); }
单元结构体
枚举类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 enum Book { Papery (u32 ), Electronic{url:String }, } fn main (){ let book =Book::Papery{index:1001 }; match book{ Book::Papery (index)=>{ println! ("Papery book {}" ,index); }, Book::Electronic{url}=>{ println! ("E-book {}" ,url); } } }
if-let语法 1 2 3 4 5 6 7 8 9 10 11 12 enum Book { Papery (u32 ), Electronic{url:String }, } fn main (){ let book =Book::Electronic (String ::from ("url" )); if let Book ::Papery (index)=book{ println! ("Papery {}" ,index); }else { println! ("No" ); } }
枚举类方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 enum Singnal { Red, Yellow, Green } impl Signal { fn yellow (&mut self ){ *self =Signal::Yellow; } } fn main (){ let mut signal =Signal::Red; signal.yellow (); }
泛型 泛型函数 1 2 3 4 5 6 7 fn get_last <T>(array:&[T])-> &T{ &array[array.len ()-1 ] } fn main (){ let a =["aaa" ,"bbb" ,"ccc" ]; println! ("{}" ,get_last::<&str >(&a)); }
泛型结构体 1 2 3 4 5 6 7 8 9 struct Point <T>{ x:T, y:T } let point =Point::<i32 >{ x:1 , y:2 } let p1 =Point (x:1 ,y:2 );
泛型枚举类 1 2 3 4 5 6 enum Shape <T>{ Rectangle (T,T); Cube (T,T,T); } let s1 =Shape::Rectangle (1 ,2 );let s3 :Shape<i32 > =Shape::Rectangle (1 ,2 );
impl泛型 对泛型类实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 struct Point <T>{ x:T, y:T } impl <T> Point<T>{ fn get_x (&self )-> &T{ &self .x } fn get_y (&self )-> &T{ &self .y } } fn main (){ let point =Point (x:3.0 ,y:4.0 ); println! ("{},{}" ,point.get0_x (),point.get_y ()); }
对具体类实现方法 1 2 3 4 5 6 7 8 9 10 11 12 struct Point <T>{ x:T, y:T } impl Point <f64 >{ fn get_x (&self )-> f64 { self .x } fn get_y (&self )-> f64 { self .y } }
泛型方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 struct Data <A,B>{ x:A, y:B } impl <A,B> Data<A,B>{ fn mix <C,D>(self ,other:Data<C,D>)-> Data<A,D>{ Data{ x:self .x, y:other.y, } } } fn main (){ let a =Data{ x:123.45 , y:"67890" }; let b =Data{ x:9876 , y:String ::from ("54321" ) }; println! ("{:?}" ,a.mix (b)); }
错误处理 不可恢复错误 1 2 3 fn main (){ panic! ("error occurred" ); }
Result枚举类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 fn divide (a:f64 ,b:f64 )-> Result <f64 ,&'static str >{ if b!=0.0 { Result ::Ok (a/b) }else { Result ::Err ("divided by zero" ) } } fn main (){ let result =divide (1.0 ,0.0 ); match result{ Ok (value)=>{ println! ("{}" ,value); }, Err (err)=>{ println! ("{}" ,err); } } }
unwrap方法:
1 let result =divide (1.0 ,0.0 ).unwrap ();
expect方法:
1 let result =divide (1.0 ,0.0 ).expect ("出错!" );
可恢复错误的传递 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fn sqrt (x:f64 )-> Result <f64 ,&'static str >{ if x>=0.0 { Result ::Ok (x.sqrt ()); }else { Result ::Err ("..." ); } } fn is_prime (x:u32 )-> Result <f64 ,&'static str >{ let result =sqrt (x as f64 )?; let t =(result+1.0 ).ceil () as u32 ; for i in 2 ..t{ if i==x{ continue ; } if x%i==0 { return Result ::Ok (0.0 ); } } return Result ::Ok (1.0 ); }
Error类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 use std::io;use std::io::Read;use std::fs::File;fn read_text_from_file (path:&str )-> Result <String ,io::Error>{ let mut f =File::open (path)?; let mut s =String ::new (); f.read_to_string (&mut s)?; Ok (s); } fn main (){ let str_file =read_text_from_file ("hello.txt" ); match str_file{ Ok (s)=>println! ("{}" ,s); Err (e)=>{ match e.kind (){ io::ErrorKind::NotFound=>{ println! ("没有这个文件" ); }, io::ErrorKind::PermissionDenied=>{ println! ("权限不够" ); }, _=>{ println! ("其他错误" ); } } } } }
空引用 Option枚举类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 fn index_of (arr:&[i32 ],em:i32 )-> Option <usize >{ let mut i :usize =0 ; while i<arr.len (){ if arr[i]==em{ return Option ::Some (i); } i+=1 ; } return Option ::None ; } fn main (){ let arr =[1 ,2 ,3 ,4 ,5 ]; let index =index_of (&arr,3 ); if let Some (i)=index{ println! ("{}" ,i); }else { println! ("元素没找到" ); } }
支持unwrap方法:
1 2 3 4 5 fn main (){ let arr =[1 ,2 ,3 ,4 ,5 ]; let index =index_of (&arr,3 ).unwrap (); println! ("{}" ,index); }
支持expect方法:
1 2 3 4 5 fn main (){ let arr =[1 ,2 ,3 ,4 ,5 ]; let index =index_of (&arr,3 ).expect ("没找到" ); println! ("{}" ,index); }
工程组织 模块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mod nation{ pub mod government{ pub fn govern (){} } mod congress{ pub fn legislate (){} } mod court{ fn judicial (){ super::congress::legislate (); } } } fn main (){ nation::government::govern (); }
结构体 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 mod house{ pub struct Breakfast { pub toast:String , fruit:String , } impl Breakfast { pub fn summer (toast:&str )=>Breakfast{ Breakfast{ toast:String ::from (toast), fruit:String ::from ("苹果" ), } } } } fn main (){ let mut meal =house::Breakfast::summer ("黑麦" ); meal.toast=String ::from ("小麦" ); println! ("{}" ,meal.toast); }
枚举类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mod a_module{ pub enum Person { King{ name:String }, Queue } } fn main (){ let person =a_module::Person::King{ name:String ::from ("Blue" ); }; if let a_module ::Person::King{name}=person{ println! ("{}" ,name); } }
use 1 2 3 4 5 6 7 8 9 10 11 12 13 14 mod nation{ pub mod government{ pub fn govern1 (){} } pub fn govern2 (){} pub use government::govern1; } use crate::nation::government::govern1;use crate::nation::govern2 as nation_govern;fn main (){ nation_govern (); govern1 (); nation::govern1 (); }
标准库 https://doc.rust-lang.org/stable/std/all.html
1 2 3 4 use std::f64 ::consts::PI;fn main (){ println! ("{}" ,PI); }
多源文件工程 second_module.rs:
1 2 3 pub fn output (){ println! ("aaa" ); }
main.rs:
1 2 3 4 5 mod second_module;fn main (){ println! ("bbb" ); second_module::output (); }
Cargo 1 2 3 4 5 6 cargo new xxx cargo init xxx cargo new xxx --lib cargo build cargo run cargo doc
导入外部包 例如在https://docs.rs/上搜索rand,在Cargo.toml中添加rand库:
1 2 3 4 5 6 7 8 [package] name ="hello" version ="0.1.0" authors =["Ulyan Sobin <ulyansobin@yeah.net>" ]edition ="2018" [dependdencies] rand ="0.8.4"
源程序中:
1 2 3 4 5 6 7 extern crate rand;fn main (){ for _ in 0 ..8 { let i :i32 =rand::random (); println! ("{}" ,i); } }
特性 定义特性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 trait Comparable { fn greater (&self ,b:&Self )-> bool ; fn less (&self ,b:&Self )-> bool ; fn equals (&self ,b:&Self )-> bool ; } struct Circle { radius:f64 , center:(f64 ,f64 ) } impl Comparable for Circle { fn greater (&self ,b:&Circle)-> bool { self .radius>b.radius } fn less (&self ,b:&Circle)-> bool { self .radius<b.radius } fn equals (&self ,b:&Circle)-> bool { self .radius==b.radius } } fn main (){ let c1 =Circle{ radius:10.0 , center:(0.0 ,0.0 ) }; let c2 =Circle{ radius:5.0 , center:(3.0 ,4.0 ) }; println! ("{}" ,c1.greater (&c2)); println! ("{}" ,c1.less (&c2)); println! ("{}" ,c1.equals (&c2)); }
默认特性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 trait Printable { fn print (&self ); fn println (&self ){ self .print (); println! ("[END]" ); } } struct Text { content:String } impl Printable for Text { fn print (&self ){ print! ("{}" ,self .content); } } fn main (){ let text =Text{ content:String ::from ("aaa" ); }; text.println (); }
常规特性参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 trait Comparable { fn greater (&self ,b:&Self )-> bool ; fn less (&self ,b:&Self )-> bool ; fn equals (&self ,b:&Self )-> bool ; } impl Comparable for f64 { fn greater (&self ,b:&Self )-> bool { *self >*b } fn less (&self ,b:&Self )-> bool { *self ><*b } fn equals (&self ,b:&Self )-> bool { *self ==*b } } fn select_sort (array:&mut [&impl Comparable ]){ for i in 0 ..array.len (){ let mut k =i; for j in (i+1 )..array.len (){ if array[j].less (&array[k]){ k=j; } } if k!=i{ let t =array[k]; array[k]=array[i]; array[i]=t; } } } fn main (){ let fa =[1.0 ,4.0 ,5.0 ,2.0 ,3.0 ]; let mut ra =[&fa[0 ],&fa[1 ],&fa[2 ],&fa[3 ],&fa[4 ]]; select_sort (&mut ra); for f in ra{ println! ("{}" ,f); } }
泛型特性参数 1 2 3 4 5 6 7 8 9 fn select_sort <T:Comparable>(array:&mut [&T]){ } fn function (a:impl SomeTrait ,b:SomeTrait,c:impl SomeTrait ){ } fn function <T:SomeTrait>(a:T,b:T,c:T){ }
特性叠加 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 trait Stringable { fn stringify (&self )-> String ; } trait Printable { fn print (&self ); } impl Stringable for i32 { fn stringify (&self )-> String { self .to_string () } } impl Printable for i32 { fn print (&self ){ println! ("{}" ,self ); } } fn print_by_two_ways (a:impl Stringable +Printable){ println! ("{}" ,a.stringify ()); a.print (); } fn main (){ let a :i32 =-123 ; print_by_two_ways (a); }
使用where关键字优化:
1 2 3 4 5 fn some_function <T:Display+Clone ,U:Clone +Debug >(t:T,u:T)fn some_function <T,U>(t:T,u:U)-> i32 where T:Display+Clone , U:Clone +Debug
特性作返回值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 trait Printable { fn print (&self ); } impl Printable for f64 { fn print (&self ){ println! ("{}" ,self ); } } impl Printable for i32 { fn print (&self ){ println! ("{}" ,self ); } } fn get_number (condition:bool )-> Box <dyn Printable>{ if condition{ return Box ::new (3.1415926_f64 ); }else { return Box ::new (10000_i32 ); } }
文件与I/O 读取整个文件(只读) 字符串读取:
1 2 3 4 5 use std::fs;fn main (){ let text =fs::read_to_string ("hello.txt" ).unwrap (); println! ("{}" ,text); }
二进制读取:
1 2 3 4 5 6 use std::fs;fn main (){ let binary =fs::read ("hello.txt" ).unwrap (); let text =String ::from_utf8 (binary).unwrap (); println! ("{}" ,text); }
打开文件并读取(只读) 字符串读取:
1 2 3 4 5 6 7 8 use std::fs::File;use std::io::Read;fn main (){ let mut file =File::open ("hello.txt" ).unwrap (); let mut text =String ::new (); file.read_to_string (&mut text); println! ("{}" ,text); }
二进制读取:
1 2 3 4 5 6 7 8 9 use std::fs::File;use std::io::Read;fn main (){ let mut file =File::open ("hello.txt" ).unwrap (); let mut binary =Vec ::<u8 >::new (); file.read_to_end (&mut binary).unwrap (); let text =String ::from_utf8 (binary).unwrap (); println! ("{}" ,text); }
流读取,缓冲区1字节:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 use std::io::Read;fn main (){ let mut file =File::open ("hello.txt" ).unwrap (); let mut buffer =[0_u8 ]; let mut binary =Vec ::<u8 >::new (); loop { let count =file.read (&mut buffer).unwrap (); if count==0 { break ; } binary.push (buffer[0 ]); } let text =String ::from+_utf8(binary).unwrap (); println! ("{}" ,text); }
新建文件 新建文件或覆盖写:
1 2 3 4 5 6 use std::fs::File;use std::io::Write;fn main (){ let mut file =File::create ("output.txt" ).unwrap (); file.write (b"aaa" ).unwrap (); }
追加写 1 2 3 4 5 6 use std::fs::OpenOptions;use std::io::Write;fn mian (){ let mut file =OpenOptions::new ().append (true ).open ("hello.txt" ).unwrap (); file.write (b"\n[SUFFIX]" ).unwrap (); }
OpenOptions对象 基本使用 1 2 3 4 5 6 7 8 let mut options =OpenOptions::new ();options.read (true ); options.write (true ); let file =options.open ("hello.txt" ).unwrap ();let file =OpenOptions::new ().read (true ).write (true ).open ("hello.txt" ).unwrap ();
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 use std::fs::OpenOptions;use std::io::{Seek,Write,SeekFrom,Read};fn main (){ let mut file =OpenOptions::new ().read (true ).write (true ).create (true ).open ("output.txt" ).unwrap (); file.write (b"aaa" ).unwrap (); file.seek (SeekFrom::Start (0 )).unwrap (); let mut buffer =String ::new (); file.read_to_string (&mut buffer).unwrap (); println! ("{}" ,buffer); let mut file =Openoptions::new ().read (true ).append (true ).open ("output.txt" ).unwrap (); file.write (b"[END]" ).unwrap (); file.seek (SeekFrom::Start (0 )).unwrap (); let mut buffer =String ::new (); file.read_to_string (&mut buffer).unwrap (); println! ("{}" ,buffer); }
二进制读写 写:
1 2 3 4 5 6 7 8 use std::fs::File;use std::io::Write;fn main (){ const PI:f64 =3.141592653589793 ; let mut file =File::create ("PI.bin" ).unwrap (); file.write (&PI.to_ne_bytes ()).unwrap (); }
读:
1 2 3 4 5 6 7 8 9 use std::fs::File;use std::io::Read;fn main (){ let mut file =File::open ("PI.bin" ).unwrap (); let mut buffer =[0_u8 ;8 ]; file.read (&mut buffer).unwrap (); let data =f64 ::from_ne_bytes (buffer); println! ("{}" ,data); }
列出目录 1 2 3 4 5 6 7 8 use std::fs;fn main (){ let dir =fs::read_dir ("./" ).unwrap (); for item in dir{ let entry =item.unwrap (); println! ("{}" ,entry.file_name ().to_str ().unwrap ()); } }
创建目录 1 2 3 4 5 6 7 8 9 10 use std::fs;fn main (){ fs::create_dir ("./data" ).unwrap (); } use std::fs;fn main (){ fs::create_dir_all ("./data/1/2" ).unwrap (); }
删除文件或目录 1 2 3 4 5 6 7 8 9 10 11 12 use std::fs;fn main (){ fs::Fiie::create ("./data/1/2/test" ).unwrap (); fs::remove_file ("./data/1/2/test" ).unwrap (); fs::remove_dir ("./data/1/2" ).unwrap (); } use std::fs;fn main (){ fs::remove_dir_all ("./data" ).unwrap (); }