Как создать бинарный файл с помощью Rust? - PullRequest
0 голосов
/ 18 декабря 2018

Я могу записать двоичный код в файл с Rust.Однако когда я создаю файл, созданный файл является текстовым, а не двоичным.Я могу создать двоичный файл с C ++, например:

ofstream is("1.in", ofstream::binary | ofstream::out | ofstream:: trunc);

Как насчет Rust?Это моя попытка:

struct IndexDataStructureInt {
    row: u32,
    key_value: u32,
}

let mut index_arr: Vec<IndexDataStructureInt> = Vec::new();
// doing something push 100 IndexDataStructureInt to index_arr
let mut fileWrite = File::create(tableIndexName).unwrap();
for i in 0..index_arr.len() {
    write!(
        fileWrite,
        "{:b}{:b}",
        index_arr[i].row, index_arr[i].key_value
    );
}

После запуска этого кода он записывает двоичное число 200 u32 в файл tableIndexName.Тем не менее, размер файла не 800 байтов.Это около 4 КБ.

1 Ответ

0 голосов
/ 18 декабря 2018

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