gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:46:40 25 4
gpt4 key购买 nike

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() {}

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

最佳答案

This answer applies to versions of Rust before 1.6.0

据我所知还没有。

查看 byteorder crate's source ,那里也定义了一个 read_all 方法:

fn read_full<R: io::Read + ?Sized>(rdr: &mut R, buf: &mut [u8]) -> Result<()> {
let mut nread = 0usize;
while nread < buf.len() {
match rdr.read(&mut buf[nread..]) {
Ok(0) => return Err(Error::UnexpectedEOF),
Ok(n) => nread += n,
Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {},
Err(e) => return Err(From::from(e))
}
}
Ok(())
}

请注意,这涉及中断的 IO 操作。

还有一个 proposed RFC ,那是几个月前提交的,进入了最终评论期,然后进行了足够多的更改,以至于它被从最终评论期中删除,正在等待另一次复审。

原来这出乎意料的复杂。 :P

关于io - 读取字节时填充用户提供的缓冲区的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31373055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com