Browse thread
[Caml-list] closing file descriptors and channels
- Christian Schaller
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Christian Schaller <Christian.Schaller@s...> |
| Subject: | [Caml-list] closing file descriptors and channels |
Hi,
Can anyone tell me how to close a file descriptor successfully? In the
code below
(* Append new line if condition cond is not satisfied on any line.
Otherwise, raise exception and return the line that fulfills the
condition. *)
let append_line_cond file_name line cond =
let file_descr = Unix.openfile file_name [Unix.O_RDWR; Unix.O_APPEND]
0o644 in
let ic = Unix.in_channel_of_descr file_descr in
let oc = Unix.out_channel_of_descr file_descr in
try
(* Read line by line and check if condition is true. If so, leave the
function and return the line that satisfied the condition *)
while true do
let line = input_line ic in
if cond line
then raise (Found line)
done
with
End_of_file -> output_string oc (line ^ "\n");
(* close all channels *)
Unix.close file_descr;
close_out oc;
close_in ic
I get a Sys_error "Bad file descriptor". As far as I figured out, the
problem is related with the creation of the two channels for input and
output. If I comment out the Unix.close, everything works fine, but I
don't know if the file_descr will be automatically closed. Hm...
Yet another closing-channels-question. If I use streams instead of
reading a file line by line, where exactly do I have to close the
channel? Is close_in on the right position below?
let read_lines ch =
let read_new_line n =
try Some (input_line ch)
with End_of_file -> close_in ch in
Stream.from read_new_line
Thank you so much, but working with files in OCaml is kind of pain in
the butt :(
Cheers,
Chris
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners