Господа, имеется такой код:
use std::fs::File;
use std::io::BufReader;
use std::io::prelude::*;
fn main() {
let args : Vec<String> = std::env::args().collect();
if args.len() < 2 {
println!("Wrong! Use: {} filename", args[0]);
return;
}
let file_name = args[1].to_string();
let input_file = match File::open(&file_name) {
Ok(file) => file,
Err(_) => {
println!("File {} not found.", file_name);
return;
}
};
let mut reader = BufReader::new(input_file);
let mut buf = [0u8; 512];
loop {
let length = reader.read(&mut buf).ok().unwrap();
if length == 0 {
break;
}
let _s = match std::str::from_utf8(&buf[0..length]) {
Ok(string) => string,
Err(e) => panic!("{}", e),
};
}
}
Проблема в том, что в файлах вперемешку идут символы разной ширины (ASCII и кириллица), поэтому иногда в буфер знак целиком не влезает и я получаю что-то вроде:
thread '<main>' panicked at 'invalid utf-8: invalid byte near index 511'
Собственно вопрос: как эффективно разрулить эту ситуацию? Дочитывать по байту, пока декодирование не пройдёт успешно? Или использовать что-то ещё?
Решение такого типа:
let mut s = std::string::String::new();
loop {
let length = reader.read_to_string(&mut s).ok().unwrap();
if length == 0 {
break;
}
}