Io 如何惯用/高效地从Read+;寻求写作?
我想从输入文件中的随机位置获取数据,然后按顺序输出到输出文件。最好是没有不必要的分配 :Io 如何惯用/高效地从Read+;寻求写作?,io,pipe,rust,Io,Pipe,Rust,我想从输入文件中的随机位置获取数据,然后按顺序输出到输出文件。最好是没有不必要的分配 : 使用std::io::{self,SeekFrom,Cursor,Read,Write,Seek}; #[测试] fn读写(){ //假设这是一个输入文件 让mut input_file=Cursor::new(b“worldholl”); //这是输出文件 让mut output_file=Vec:::new(); 汇编(&mut输入\文件,&mut输出\文件).unwrap(); assert_eq!(
使用std::io::{self,SeekFrom,Cursor,Read,Write,Seek};
#[测试]
fn读写(){
//假设这是一个输入文件
让mut input_file=Cursor::new(b“worldholl”);
//这是输出文件
让mut output_file=Vec:::new();
汇编(&mut输入\文件,&mut输出\文件).unwrap();
assert_eq!(b“helloworld”&输出_文件[…]);
}
//我想从输入文件中的随机位置获取数据
//并按顺序将它们输出到输出文件
发布fn汇编(输入:&mut I,输出:&mut O)->结果
其中I:Read+Seek,O:Write
{
//首先查找并输出“hello”
try!(input.seek(参见kfrom::Start(5));
让mut hello_buf=[0u8;5];
试试!(输入。获取(5)。读取(&mut hello_buf));
试试!(output.write(&hello_buf));
//然后输出“世界”
try!(input.seek(参见kfrom::Start(0));
让mut world_buf=[0u8;5];
尝试!(输入。获取(5)。读取(&mut world_buf));
try!(output.write(&world_buf));
好(())
}
这里我们不必担心I/O延迟
问题:
使用std::io:{self,prelude::*,SeekFrom};
pub fn assemble(mut输入:I,mut输出:O)->结果
哪里
I:读+找,
O:写,
{
//首先查找并输出“hello”
查找(参见从::开始(5))?;
io::复制(&mut input.by_ref().take(5),&mut output)?;
//然后输出“世界”
查找(SeekFrom::Start(0))?;
io::复制(&mut input.take(5),&mut output)?;
好(())
}
如果您查看,您可以看到它与您的代码类似。但是,它会注意处理更多错误情况:
write
确实不是总是写你要求它写的所有东西李>
它还使用了更大的缓冲区大小,但仍然是堆栈分配的。无关:将assemble更改为使用
,它甚至更通用(允许trait对象)。
use std::io::{self, prelude::*, SeekFrom};
pub fn assemble<I, O>(mut input: I, mut output: O) -> Result<(), io::Error>
where
I: Read + Seek,
O: Write,
{
// first seek and output "hello"
input.seek(SeekFrom::Start(5))?;
io::copy(&mut input.by_ref().take(5), &mut output)?;
// then output "world"
input.seek(SeekFrom::Start(0))?;
io::copy(&mut input.take(5), &mut output)?;
Ok(())
}