Definition read_file (nbytes: nat): list memval := read_file_aux nbytes (get_size f) fptr.Fixpoint write_file_aux (bytes: list memval) (sz cur: nat): (nat -> memval)*nat :=
  match bytes with
  | nil => (contents, O)
  | byte::bytes' =>
    match write_file_aux bytes' sz (S cur) with (contents', nbytes) =>
        (fun ofs => if eq_nat_dec ofs cur then byte else contents' ofs, S nbytes)
    end
  end.

Lemma write_file_aux_length (bytes: list memval) (sz cur: nat): snd (write_file_aux bytes sz cur)=length bytes.