【发布时间】:2020-07-28 00:55:08
【问题描述】:
我需要将数据读入精确大小的块(最后一个块可能被部分填充)。理想情况下,此方法也适用于 Read 的所有类型。我最初的想法是这样的:
use std::io::{self, prelude::*};
use std::error;
const CHUNK_SIZE: usize = 2;
fn main() -> Result<(), Box<dyn error::Error>> {
let mut a = &[1u8, 2, 3, 4, 5][..]; // Some Read type
let mut buf = vec![0u8; CHUNK_SIZE];
loop {
match a.read_exact(&mut buf) {
Ok(_) => println!("{:?}", buf),
Err(ref e) if e.kind() == io::ErrorKind::UnexpectedEof => break,
Err(e) => return Err(e.into()),
}
}
buf.clear();
a.read_to_end(&mut buf)?;
println!("{:?}", buf);
Ok(())
}
这个玩具示例有效;但是,阅读documentation for Read 我似乎无法推断它是否正确。文档说,在read_exact 失败后,无法假设缓冲区内容。失败的read_exact 之后的read_to_end 是否总是会检索那些剩余的字节?
这段代码是正确的还是有更好的读取块的方法?
【问题讨论】:
-
重要的句子是:“如果此函数返回错误,则未指定它读取了多少字节......”您的代码假定
read_exact读取 0 字节失败,但这不是可靠的假设。