use std::env; use std::cmp::max; use std::fs::File; use std::io::Read; use std::process; fn main() { let args: Vec = env::args().collect(); if args.len() < 2 { println!("Too few arguments."); process::exit(1); } let filename = &args[1]; // Your code here :) let mut file = File::open(filename).expect(format!("Cannot open file: {}\n", filename).as_str()); let mut buffer = [0; 1024]; let mut line_count = 0; let mut word_count = 0; let mut byte_count = 0; let mut skip_ws = false; let mut in_word = false; loop { let rd_size = file .read(&mut buffer) .expect(format!("Error reading file: {}", filename).as_str()); if rd_size == 0 { break; } byte_count += rd_size; for v in buffer { if v == b'\n' { line_count += 1; } if v.is_ascii_whitespace() { if in_word && !skip_ws { skip_ws = true; in_word = false; word_count += 1; } } else { in_word = true; skip_ws = false; } } } let str_line_count = format!("{line_count}"); let str_word_count = format!("{word_count}"); let str_byte_count = format!("{byte_count}"); let align = max( str_line_count.len(), max(str_word_count.len(), str_byte_count.len()), ); println!( "{:>align$} {:>align$} {:>align$} {filename}", str_line_count, str_word_count, str_byte_count ); }