2015-07-12 7 views
7

Read::read zwraca liczbę faktycznie przeczytanych bajtów, która może być mniejsza niż żądany bufor. W wielu przypadkach dopuszczalne jest wykonywanie wielu połączeń do read w celu całkowitego wypełnienia bufora.Co to jest idiomatyczny sposób wypełniania bufora dostarczanego przez użytkownika podczas odczytywania bajtów?

Mam ten kod, ale wydaje się dość niezgrabny:

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

Czy istnieje funkcja w bibliotece standardowej, które będą abstrakcyjne ta praca z dala dla mnie?

Odpowiedz

3

Od RFC wymienionego w drugiej Odpowiedź została zaakceptowana, realizowane i dostępne w Rust 1.6.0, można po prostu użyć metody Reader::read_exact():

try!(r.read_exact(&mut buf)) 

Albo, używając operatora introduced in Rust 1.13.0?:

r.read_exact(&mut buf)? 
4

Ta odpowiedź odnosi się do wersji 1.6.0 przed Rust

Nie o ile wiem.

Patrząc na byteordercrate's source, tam read_all Sposób określony tam też:

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

Zauważ, że to dotyczy przerwanych operacji IO.

Jest też proposed RFC, który został złożony kilka miesięcy temu, udał się do końcowego okresu komentarz, a następnie zmienił się na tyle, że została ona podjęta się końcowego okresu komentarz i czeka na kolejny odejścia na drugi krąg.

Okazuje się, że jest to nieoczekiwanie skomplikowane. : P