2016-09-11 3 views
2

Я получаю это исключение, когда я пытаюсь запустить мой тест:не может немедленно декодировать объект записывается в файл с bincode

thread 'persistent_log::doc::test::test_sync' panicked at 'called `Result::unwrap()` on an `Err` value: IoError(Error { repr: Os { code: 9, message: "Bad file descriptor" } })', ../src/libcore/result.rs:783 

Term:

#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord,RustcEncodable,RustcDecodable)] 
pub struct Term(u64); 

Тест:

fn create() { 
    File::create(&"term"); 
} 

#[test] 
fn test_sync() { 
    create(); 

    let mut f = File::open(&"term").unwrap(); 

    let term = Term(10); 

    encode_into(&term, &mut f, SizeLimit::Infinite).unwrap(); 

    let decoded_term: Term = decode_from(&mut f, SizeLimit::Infinite).unwrap(); 

    assert_eq!(decoded_term, term); 
} 

Я хочу написать объект term в файл, а затем прочитать его.

ответ

10

File::open открывает файл в режиме только для чтения, поэтому запись на него не удастся.

Чтобы открыть файл с доступом для чтения и записи, вы должны использовать OpenOptions.

use std::fs::OpenOptions; 

let file = OpenOptions::new() 
      .read(true) 
      .write(true) 
      .create(true) 
      .open("term"); 

Отлично, но теперь я получаю новое исключение:

thread 'persistent_log::doc::test::test_sync' panicked at 'called Result::unwrap() on an Err value: IoError(Error { repr: Custom(Custom { kind: UnexpectedEof, error: StringError("failed to fill whole buffer") }) })', ../src/libcore/result.rs:783

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

file.seek(SeekFrom::Start(0));