2015-05-23 25 views
8

BufStream<T> ile T: Read+Write numaralı bir yapımız var. BufStream, TcpStream olabilir ve ondan n bayt okumak istiyorum. Önceden tanımlanmış bir tamponda sabit bir bayt miktarı değil, ancak bir sonraki okunacak bayt sayısını gösteren bir dize/akışım var.Akıştan belirli bir bayt sayısı nasıl okunur?

Bunu yapmanın iyi bir yolu var mı?

cevap

3

Size Read::take ve Read::read_to_end istedikleri gibi sesler:

use std::io::prelude::*; 
use std::io::BufReader; 
use std::str; 

fn read_n<R>(reader: R, bytes_to_read: u64) -> Vec<u8> 
where 
    R: Read, 
{ 
    let mut buf = vec![]; 
    let mut chunk = reader.take(bytes_to_read); 
    // Do appropriate error handling for your situation 
    let n = chunk.read_to_end(&mut buf).expect("Didn't read enough"); 
    assert_eq!(bytes_to_read as usize, n); 
    buf 
} 

fn main() { 
    let input_data = b"hello world"; 
    let mut reader = BufReader::new(&input_data[..]); 

    let first = read_n(&mut reader, 5); 
    let _ = read_n(&mut reader, 1); 
    let second = read_n(&mut reader, 5); 

    println!(
     "{:?}, {:?}", 
     str::from_utf8(&first), 
     str::from_utf8(&second) 
    ); 
} 
+0

Teşekkürler ..() okuyucuyu tüketmiyor mu? Usecase, satırları okuduğum bir tcpstream (bir yapının parçası) var. Bazen aralarında bir satır okumam ve belirli bir bayt miktarına ihtiyacım yok. Daha sonra tekrar satırları okumam gerekecek ... – buster

+1

Yapıyor, ama "okuyucu", başka bir okuyucunun geçici olarak değişebilen bir referansı olabilir. Take, tüm kullanım durumları desteklenecek şekilde bir by-value API kullanır. Bu model pasın bazı farklı köşelerinde görünür. – bluss

+0

Buster'ın bluss olarak işaret ettiği gibi & mut R', 'Read 'özelliğini de uygular. Örneğim, bunun iyi bir etki yaratması için kullanıyor - bu yüzden örnekte ana yönteme '& mut okuyucu' iletiyorum. – Shepmaster

4

Rust 1.6 beri Read::read_exact bunu yapmak için de kullanılabilir. bytes_to_read muhtemelen zamanında belirlenir okumak için gereken bayt sayısını belirten ve reader okuma akışı ise: read_exact belgelerinden bana net değildi

let mut buf = vec![0u8; bytes_to_read]; 
reader.read_exact(&mut buf)?; 

parçası hedefinin olmasıydı arabellek, dinamik olarak ayrılmış bir Vec olabilir.

Bu çözüm için beni işaret eden Rust Gitter topluluğuna teşekkür ederiz.

İlgili konular