在读取字节时填充用户提供的缓冲区的惯用方法是什么?

She*_*ter 7 io rust

Read::read返回它实际读取的字节数,可以小于请求的缓冲区.在许多情况下,可以进行多次调用read以完全填充缓冲区.

我有这个代码,但它似乎非常笨拙:

use std::io::{self, Read};

fn read_complete<R>(mut rdr: R, buf: &mut [u8]) -> io::Result<()>
    where R: Read
{
    let mut total_read = 0;

    loop {
        let window = &mut buf[total_read..];
        let bytes_read = try!(rdr.read(window));

        // Completely filled the buffer
        if window.len() == bytes_read {
            return Ok(());
        }

        // Unable to read anything
        if bytes_read == 0 {
            return Err(io::Error::new(io::ErrorKind::Other, "Unable to read complete buffer"));
        }

        // Partial read, continue
        total_read += bytes_read;
    }
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

标准库中是否有一个函数可以为我抽象出这项工作?

Ser*_*aev 3

由于其他答案中提到的RFC在 Rust 1.6.0 中已被接受、实现和可用,因此您可以使用以下Reader::read_exact()方法:

try!(r.read_exact(&mut buf))
Run Code Online (Sandbox Code Playgroud)

或者,使用Rust 1.13.0 中引入的?运算符:

r.read_exact(&mut buf)?
Run Code Online (Sandbox Code Playgroud)