我有一个文件,比如说myfile
。使用 Rust,我想打开myfile
并将字节 N 到 M 读入 a中Vec
。myvec
最惯用的方法是什么?天真地,我想到使用bytes()
, then skip
, take
and collect
,但这听起来效率很低。
Tho*_*mas 10
最惯用的(据我所知)和相对有效的方法:
let start = 10;
let count = 10;
let mut f = File::open("/etc/passwd")?;
f.seek(SeekFrom::Start(start))?;
let mut buf = vec![0; count];
f.read_exact(&mut buf)?;
Run Code Online (Sandbox Code Playgroud)
您在评论中表示您担心在读入内存之前将内存清零的开销。事实上,这样做的成本不为零,但与从文件中读取所需的 I/O 操作相比,它通常可以忽略不计,而且优点是您的代码保持 100% 健全。但出于教育目的,我试图想出一种避免归零的方法。
不幸的是,即使使用不安全的代码,我们也无法安全地将未初始化的缓冲区传递给,read_exact
因为文档中的这一段(强调我的):
不保证调用此函数时的内容
buf
,实现不能依赖 buf 内容的任何属性为 true。建议实现仅写入数据buf
而不是读取其内容。
因此,从提供的缓冲区中读取数据在技术上是合法的,这意味着我们不能在这里合法地传递未初始化的数据File::read_exact
(使用)MaybeUninit
。