读取大的f64二进制文件到数组



我正在寻找有关如何将相对较大的(>12M)双精度数字二进制文件读取到rust数组的帮助/示例。我有关于文件中f64值数量的元数据。

我读过这篇文章,看过字节顺序箱,但没有发现文档/示例特别有用。

这不是需要BufRead的东西,因为这可能对性能没有帮助。

谢谢!

最简单的方法是读取8字节并使用f64::from_byte-order_bytes()方法之一将其转换为f64:

  • from_ne_bytes()
  • from_be_bytes()
  • from_le_bytes()

这些方法的用法如下:

let mut buffer = [0u8; 8]; // the buffer can be reused!
reader.read_exact(&mut buffer) ?;
let float = f64::from_be_bytes(buffer);

所以你可以一次读取8个字节的文件,也可以读取一些更大的块:

fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("./path/to/file")?;
let mut reader = BufReader::new(file);
let mut buffer = [0u8; 8];
loop {
if let Err(e) = reader.read_exact(&mut buffer) {
// if you know how many bytes are expected, then it's better not to rely on `UnexpectedEof`!
if e.kind() == ErrorKind::UnexpectedEof {
// nothing more to read
break;
}
return Err(e.into());
}
// or use `from_le_bytes()` depending on the byte-order
let float = f64::from_be_bytes(buffer);
//do something with the f64
println!("{}", float);
}
Ok(())
}

如果你不介意在你的项目中添加额外的依赖,那么你也可以使用ByteOrdercrate,它有方便的方法来读取整个切片:

use byteorder::{ByteOrder, LittleEndian};
let mut bytes = [0; 32]; // the buffer you've read the file into
let mut numbers_got = [0.0; 4];
LittleEndian::read_f64_into(&bytes, &mut numbers_got);
assert_eq!(numbers_given, numbers_got)