Rust std::fs::File
не имеет концепции открытия файлов в текстовом или двоичном режиме.Все файлы открываются как «двоичные» файлы, и перевод символов, таких как перевод строки и возврат каретки, не выполняется.
Ваша проблема связана с использованием макроса write!
.Этот макрос предназначен для форматирования данных в печатный формат и не должен использоваться, если вы хотите записать двоичные данные.Фактически используемый вами спецификатор формата {:b}
преобразует значение в двоичную строку ASCII 1
и 0
для печати.
Вместо этого используйте функции, предоставляемыечерта std::io::Write
.Эта черта реализуется непосредственно с помощью File
, или вы можете использовать BufWriter
для потенциально лучшей производительности.
Например: здесь я использую write_all
, чтобы записать срез u8
в файлзатем используйте read_to_end
для чтения того же файла обратно в Vec
.
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()> {
{
let mut file = File::create("test")?;
// Write a slice of bytes to the file
file.write_all(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])?;
}
{
let mut file = File::open("test")?;
// read the same file back into a Vec of bytes
let mut buffer = Vec::<u8>::new();
file.read_to_end(&mut buffer)?;
println!("{:?}", buffer);
}
Ok(())
}