File tree Expand file tree Collapse file tree 7 files changed +194
-0
lines changed
Expand file tree Collapse file tree 7 files changed +194
-0
lines changed Original file line number Diff line number Diff line change 1+ import sys
2+ from pathlib import Path
3+
4+
5+ def bytes_from_file (filename ):
6+ return bytearray (Path (filename ).read_bytes ())
7+
8+
9+ if __name__ == "__main__" :
10+ filename = sys .argv [1 ]
11+ data = bytes_from_file (filename )
12+ print (f"data size { len (data )} bytes" )
13+
14+ user_home = Path .home ()
15+ user_fonts = user_home .joinpath ('Library' , 'Fonts' )
16+ print (f"user_home: { user_home } user_fonts: { user_fonts } " )
17+
18+ data = bytes_from_file (user_fonts )
Original file line number Diff line number Diff line change 1+ import sys
2+
3+
4+ if __name__ == "__main__" :
5+
6+
7+ with open (sys .argv [1 ]) as fh :
8+ count = 0
9+
10+
11+ for line in fh :
12+ elems = line .split (',' )
13+ if elems [1 ] == "Tanzania" :
14+ count += 1
15+
16+
17+
18+ print (f"found { count } sales for Tanzania" )
Original file line number Diff line number Diff line change 1+ [package ]
2+ name = " binary"
3+ version = " 0.1.0"
4+ authors = [" Bedroom Builds" ]
5+ edition = " 2018"
6+
7+ # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+ [dependencies ]
10+ dirs = " 3.0.1"
Original file line number Diff line number Diff line change 1+ use std:: io;
2+ use std:: path:: { Path , PathBuf } ;
3+
4+ fn bytes_from_file ( filename : impl AsRef < std:: path:: Path > ) -> io:: Result < Vec < u8 > > {
5+ Ok ( std:: fs:: read ( filename) ?)
6+ }
7+
8+ fn main ( ) -> io:: Result < ( ) > {
9+ let args: Vec < String > = std:: env:: args ( ) . collect ( ) ;
10+
11+ let data = bytes_from_file ( & args[ 1 ] ) ?;
12+ println ! ( "data size {}bytes" , data. len( ) ) ;
13+
14+ let user_home: PathBuf = dirs:: home_dir ( ) . expect ( "Could not find home directory." ) ;
15+ let user_fonts = Path :: new ( & user_home) . join ( "Library" ) . join ( "Fonts" ) ;
16+ println ! ( "user_home: {:?} user_fonts: {:?}" , user_home, user_fonts) ;
17+
18+ let _data = bytes_from_file ( user_fonts) ?;
19+ Ok ( ( ) )
20+ }
Original file line number Diff line number Diff line change 1+ /// Example using single Stringbuffer and iterators (needs to use Rc!)
2+
3+ fn main ( ) -> std:: io:: Result < ( ) > {
4+ for line in my_reader:: BufReader :: open ( "Cargo.toml" ) ? {
5+ println ! ( "{}" , line?. trim( ) ) ;
6+ }
7+
8+ Ok ( ( ) )
9+ }
10+
11+ mod my_reader {
12+ use std:: {
13+ fs:: File ,
14+ io:: { self , prelude:: * } ,
15+ rc:: Rc ,
16+ } ;
17+
18+ pub struct BufReader {
19+ reader : io:: BufReader < File > ,
20+ buf : Rc < String > ,
21+ }
22+
23+ fn new_buf ( ) -> Rc < String > {
24+ Rc :: new ( String :: with_capacity ( 1024 ) ) // Tweakable capacity
25+ }
26+
27+ impl BufReader {
28+ pub fn open ( path : impl AsRef < std:: path:: Path > ) -> io:: Result < Self > {
29+ let file = File :: open ( path) ?;
30+ let reader = io:: BufReader :: new ( file) ;
31+ let buf = new_buf ( ) ;
32+
33+ Ok ( Self { reader, buf } )
34+ }
35+ }
36+
37+ impl Iterator for BufReader {
38+ type Item = io:: Result < Rc < String > > ;
39+
40+ fn next ( & mut self ) -> Option < Self :: Item > {
41+ let buf = match Rc :: get_mut ( & mut self . buf ) {
42+ Some ( buf) => {
43+ buf. clear ( ) ;
44+ buf
45+ }
46+ None => {
47+ self . buf = new_buf ( ) ;
48+ Rc :: make_mut ( & mut self . buf )
49+ }
50+ } ;
51+
52+ self . reader
53+ . read_line ( buf)
54+ . map ( |u| {
55+ if u == 0 {
56+ None
57+ } else {
58+ Some ( Rc :: clone ( & self . buf ) )
59+ }
60+ } )
61+ . transpose ( )
62+ }
63+ }
64+ }
Original file line number Diff line number Diff line change 1+ /// Example using a single String Buffer vs new String for every line
2+
3+ fn main ( ) -> std:: io:: Result < ( ) > {
4+ let mut reader = my_reader:: BufReader :: open ( "Cargo.toml" ) ?;
5+ let mut buffer = String :: new ( ) ;
6+
7+ while let Some ( line) = reader. read_line ( & mut buffer) {
8+ println ! ( "{}" , line?. trim( ) ) ;
9+ }
10+
11+ Ok ( ( ) )
12+ }
13+
14+ mod my_reader {
15+ use std:: {
16+ fs:: File ,
17+ io:: { self , prelude:: * } ,
18+ } ;
19+
20+ pub struct BufReader {
21+ reader : io:: BufReader < File > ,
22+ }
23+
24+ impl BufReader {
25+ pub fn open ( path : impl AsRef < std:: path:: Path > ) -> io:: Result < Self > {
26+ let file = File :: open ( path) ?;
27+ let reader = io:: BufReader :: new ( file) ;
28+
29+ Ok ( Self { reader } )
30+ }
31+
32+ pub fn read_line < ' buf > (
33+ & mut self ,
34+ buffer : & ' buf mut String ,
35+ ) -> Option < io:: Result < & ' buf mut String > > {
36+ buffer. clear ( ) ;
37+
38+ self . reader
39+ . read_line ( buffer)
40+ . map ( |u| if u == 0 { None } else { Some ( buffer) } )
41+ . transpose ( )
42+ }
43+ }
44+ }
Original file line number Diff line number Diff line change 1+ use std:: fs:: File ;
2+ use std:: io:: { self , BufRead , BufReader } ;
3+
4+ fn main ( ) -> io:: Result < ( ) > {
5+ let args: Vec < String > = std:: env:: args ( ) . collect ( ) ;
6+
7+ let file = File :: open ( & args[ 1 ] ) ?;
8+ let reader = BufReader :: new ( file) ;
9+
10+ let mut found = 0usize ;
11+ for line in reader. lines ( ) {
12+ let line = line?;
13+ let elems: Vec < & str > = line. split ( ',' ) . collect ( ) ;
14+ if elems[ 1 ] == "Tanzania" {
15+ found += 1 ;
16+ }
17+ }
18+ println ! ( "found {} sales for Tanzania" , found) ;
19+ Ok ( ( ) )
20+ }
You can’t perform that action at this time.
0 commit comments