let with_temp_file pre suf fct =
let tmp = Filename.temp_file pre suf in
(* Sys.remove is used instead of sys_remove since we know that the tempfile is not that important *)
try let res = fct tmp in Sys.remove tmp; res
with e -> (Sys.remove tmp; raise e)