Browse thread
RE: [Caml-list] closing file descriptors and channels
[
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: | RE: [Caml-list] closing file descriptors and channels |
> close_out and close_in both perform the equivalent of a Unix.close on
> the underlying Unix file descriptor, and, yes, closing something that
> is already closed is an I/O exception. So, one possibility is to
> close only one of the three entities file_descr, oc and ic. It's best
> to close the output channel oc, since this will flush its buffer.
What I did was just skipping the Unix.close, but close *both* in- and
out-channels and it worked (until now ;-) ).
> Side remark: you'd need to close the file descriptor also in the case
> where the line is found and the exception Found is raised.
Yup, I've seen this one already. This one makes it complicated, since
for propagating the exception, I have to duplicate the closings:
.
.
.
with
End_of_file -> output_string oc (line ^ "\n");
Found line -> (close_out oc; close_in ic; raise Found line);
close_out oc;
close_in ic
Since I am new to streams & co, are there any kind of rules when to
prefer streams to normal I/O? Is there more overhead when using
streams? Shouldn't I use streams when working on a regular text file?
What if I want to break from a stream with an exception (as above the
Found exception)? Closing/accessing the channel is only possible in the
stream creation as in my corrected version:
let read_lines ch =
let read_new_line n =
try Some (input_line ch)
with End_of_file -> close_in ch; None in
Stream.from read_new_line
Now I want to stop reading lines after a certain number of lines
let rec read_n_lines n =
parser
[< 'line; rest >] -> if n <> 0 then print_endline line; read_n_lines
(n-1) else ()
[< >] -> ()
Didn't type-check it, though ;-) Anyway, how can I close the stream in
this case?
Thanks!
- 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