kper
kper

Reputation: 371

Cannot immediately decode an object written to a file with bincode

I am getting this exception when I try to run my test:

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);

Test:

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);
}

I want to write the object term into a file and afterwards read it in.

Upvotes: 2

Views: 1482

Answers (1)

Francis Gagné
Francis Gagné

Reputation: 65822

File::open opens a file in read-only mode, so writing to it will fail.

To open a file with read and write access, you must use OpenOptions.

use std::fs::OpenOptions;

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

Great, but now I get a new exception:

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

After you've written bytes to the file, the file's cursor will be located at the end of the file. Before you try read from the file, you'll have to seek back to the start of the file, otherwise you'll get this error.

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

Upvotes: 12

Related Questions