将大型 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)
我正在寻找 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)