我想从具有已知偏移量和大小的文件中读取UTF-8字符串,
所以我写道:

fn test(file: &mut File, offset: u64, length: usize) -> Result<String, String> {
    try!(file.seek(SeekFrom::Start(offset)).map_err(|err| err.to_string()));
    let mut buffer = Vec::<u8>::with_capacity(length);
    buffer.resize(length, 0_u8);
    try!(file.read_exact(& mut buffer).map_err(|err| err.to_string()));
    let utf8_s = try!(from_utf8(&buffer).map_err(|err| "invalid utf-8 data in data".to_string()));
    Result::Ok(String::from(utf8_s))
}

在我的代码中,我不喜欢两件事:
  • 我用0初始化了Vec,但这没用,因为在
    下一行我称为file.read_exact。我可以在没有堆的情况下分配内存吗
    初始化吗?
  • 我在堆上创建了Vec,最后我通过String再次分配了内存。我分配了相同数量的内存,并从一个位置复制到另一个位置。是否可以使用length内存需求而不是2 * length来实现此功能?
  • 最佳答案

  • Rust没有“只写”内存的概念,因此,避免初始化Vec的唯一方法是使用unsafe代码。除非您能证明这是程序的实际性能问题,否则请原样保留。
  • 您可以只使用 String::from_utf8 来进行就地转换。
  • 关于rust - 如何优化从具有已知偏移量和大小的文件中读取UTF-8字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38161695/

    10-13 07:05