Как записать двоичное число в файл и получить его в ржавчине - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь записать число в файл.Номер в файле, который я не хочу представлять в виде UFT-8 или какой-либо другой кодировки.Я просто хочу двоичное представление числа, записанного в файл.

Код пытается записать в файл и затем прочитать файл обратно пользователю.

use std::fs::File;
use std::io::prelude::*;

fn main() -> () {
    let number:usize =244128131191;
    let mut file = File::create("data").expect("create failed");
    file.write_all(&[number]).expect("write failed");
    println!("data written to file" );

    let mut file = File::open("data").expect("open failed");
    let mut buffer = Vec::<usize>::new();
    file.read_to_end(&mut buffer);
    println!("{:?}", buffer);
}

Я получаю этоошибка обратно жаловаться на используемые типы.

   Compiling writing_file v0.1.0 (file:///home/9716278/writing_file)
error[E0308]: mismatched types
  --> src/main.rs:37:22
   |
37 |     file.write_all(&[number]).expect("write failed");
   |                      ^^^^^^ expected u8, found usize

error[E0308]: mismatched types
  --> src/main.rs:42:22
   |
42 |     file.read_to_end(&mut buffer);
   |                      ^^^^^^^^^^^ expected u8, found usize
   |
   = note: expected type `&mut std::vec::Vec<u8>`
              found type `&mut std::vec::Vec<usize>`

error: aborting due to 2 previous errors

error: Could not compile `counting_utf`.

To learn more, run the command again with --verbose.

Я не уверен, что происходит не так.Проблема заключается в том, чтобы делать с типами в соответствии с ошибкой.Я не пользователь, если это правильный подход к тому, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 28 сентября 2019

Файл при чтении имеет неизвестную длину (поэтому он считывается в вектор без фиксированной длины), но переменная, которую вы хотите в конце, имеет тип usize.

Я показал здесь, что вы можетепреобразовать вектор в массив фиксированного размера, а затем преобразовать его в переменную usize.

Надеюсь, кто-то может улучшить этот ответ!

use std::fs::File;
use std::io::prelude::*;

fn main() -> () {
    let number:usize = 244128131191;
    // write number to file
    let mut file = File::create("data").expect("create failed");
    file.write_all(&number.to_ne_bytes()).expect("write failed");
    println!("data written to file" );

    // read file
    let mut file = File::open("data").expect("open failed");
    let mut buffer = Vec::<u8>::new();
    file.read_to_end(&mut buffer);

    //convert binary in vector back a variable of type usize
    let mut arr = [0; 8]; //setup an empty array with 8 elements
    arr.copy_from_slice(&buffer[0..buffer.len()]); //fill the fixed size array with the slice
    let reading_of_number = usize::from_ne_bytes(arr); //convert the array to a variable of type usize
    println!("{:?}", reading_of_number);
}

Обратите внимание на последствия использования to_ne_bytes () иfrom_ne_bytes ().

Если файл будет записан на одном компьютере и прочитан на другом, вам вместо этого потребуется использовать to_be_bytes или to_le_bytes, в зависимости от ситуации.Однако, если файл всегда будет записываться и считываться на одном и том же компьютере, это не должно быть проблемой, и вы можете продолжать использовать to_ne_bytes () и from_ne_bytes () - см. Документы https://doc.rust -lang.org /std / primitive.u64.html # method.to_ne_bytes

Спасибо @ user2722968 за предложение улучшить ответ с важностью понимания be / le / ne.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...