将大型 f64 二进制文件读入数组

Read large f64 binary file into array

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

我读过这篇文章并看过 byteorder crate,但没有发现 documentation/examples 特别有用。

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

谢谢!

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

这些方法是这样使用的:

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(())
}

如果您不介意为您的项目添加额外的依赖项,那么您也可以使用 ByteOrder crate which has convenience methods 来读取整个切片:

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)