I have something that is Read
; currently it's a File
. I want to read a number of bytes from it that is only known at runtime (length prefix in a binary data structure).
So I tried this:
let mut vec = Vec::with_capacity(length);
let count = file.read(vec.as_mut_slice()).unwrap();
but count
is zero because vec.as_mut_slice().len()
is zero as well.
[0u8;length]
of course doesn't work because the size must be known at compile time.
I wanted to do
let mut vec = Vec::with_capacity(length);
let count = file.take(length).read_to_end(vec).unwrap();
but take
's receiver parameter is a T
and I only have &mut T
(and I'm not really sure why it's needed anyway).
I guess I can replace File
with BufReader
and dance around with fill_buf
and consume
which sounds complicated enough but I still wonder: Have I overlooked something?
Like the Iterator adaptors, the IO adaptors take self
by value to be as efficient as possible. Also like the Iterator adaptors, a mutable reference to a Read
is also a Read
.
To solve your problem, you just need Read::by_ref
:
use std::io::Read;
use std::fs::File;
fn main() {
let mut file = File::open("/etc/hosts").unwrap();
let length = 5;
let mut vec = Vec::with_capacity(length);
file.by_ref().take(length as u64).read_to_end(&mut vec).unwrap();
let mut the_rest = Vec::new();
file.read_to_end(&mut the_rest).unwrap();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With