59 lines
1.6 KiB
Rust
59 lines
1.6 KiB
Rust
use std::env;
|
|
use std::cmp::max;
|
|
use std::fs::File;
|
|
use std::io::Read;
|
|
use std::process;
|
|
|
|
fn main() {
|
|
let args: Vec<String> = 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
|
|
);
|
|
}
|