io - कैसे लिखने के लिए पढ़ें+आईडीईमैटिक रूप से/कुशलता से पाइप डेटा को पढ़ें?



pipe rust (1)

मैं इनपुट फ़ाइल में यादृच्छिक स्थानों से डेटा लेना चाहता हूं, और उन्हें आउटपुट फ़ाइल में क्रमिक रूप से आउटपुट करना चाहता हूं। अधिमानतः बिना अनावश्यक आवंटन के साथ

यह एक प्रकार का समाधान है जो मुझे लगा है :

use std::io::{ self, SeekFrom, Cursor, Read, Write, Seek };

#[test]
fn read_write() {
    // let's say this is input file
    let mut input_file = Cursor::new(b"worldhello");
    // and this is output file
    let mut output_file = Vec::<u8>::new();

    assemble(&mut input_file, &mut output_file).unwrap();

    assert_eq!(b"helloworld", &output_file[..]);
}

// I want to take data from random locations in input file
// and output them sequentially to output file
pub fn assemble<I, O>(input: &mut I, output: &mut O) -> Result<(), io::Error> 
    where I: Read + Seek, O: Write 
{
    // first seek and output "hello"
    try!(input.seek(SeekFrom::Start(5)));
    let mut hello_buf = [0u8; 5];
    try!(input.take(5).read(&mut hello_buf));
    try!(output.write(&hello_buf));

    // then output "world"
    try!(input.seek(SeekFrom::Start(0)));
    let mut world_buf = [0u8; 5];
    try!(input.take(5).read(&mut world_buf));
    try!(output.write(&world_buf));

    Ok(())
}

चलो यहाँ I / O विलंबता के बारे में चिंता मत करो।

प्रशन:

  1. क्या स्थिर जंग में कुछ सहायक हैं जो एक्स बाइट्स को एक स्ट्रीम से लेकर उन्हें किसी अन्य स्ट्रीम में धकेलते हैं? या क्या मुझे अपना अपना रोल करना है?
  2. अगर मुझे अपना रोल करना पड़ता है, तो शायद एक बेहतर तरीका है?

आप io::copy तलाश कर रहे हैं:

pub fn assemble<I, O>(input: &mut I, output: &mut O) -> Result<(), io::Error> 
    where I: Read + Seek, O: Write 
{
    // first seek and output "hello"
    try!(input.seek(SeekFrom::Start(5)));
    try!(io::copy(&mut input.take(5), output));

    // then output "world"
    try!(input.seek(SeekFrom::Start(0)));
    try!(io::copy(&mut input.take(5), output));

    Ok(())
}

यदि आप io::copy के कार्यान्वयन को देखते हैं, तो आप देख सकते हैं कि यह आपके कोड जैसा है। हालांकि, यह अधिक त्रुटि मामलों को संभालने के लिए देखभाल करता है:

  1. write हमेशा वह सब कुछ नहीं लिखता है जो आपसे पूछते हैं!
  2. एक "बाधित" लिखना आमतौर पर घातक नहीं है।

यह एक बड़ा बफर आकार का भी उपयोग करता है, लेकिन फिर भी स्टैक- यह आवंटित करता है