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: | 2003-11-20 (16:14) |
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