Library
Module
Module type
Parameter
Class
Class type
type t = Caml.out_channel
val stdout : t
val stderr : t
type 'a with_create_args =
?binary:Base.Bool.t ->
?append:Base.Bool.t ->
?fail_if_exists:Base.Bool.t ->
?perm:Base.Int.t ->
'a
val create : (Base.String.t -> t) with_create_args
val with_file : (Base.String.t -> f:(t -> 'a) -> 'a) with_create_args
val close : t -> Base.Unit.t
close t
flushes and closes t
, and may raise an exception. close
returns () and does not raise if t
is already closed. close
raises an exception if the close() system call on the underlying file descriptor fails (i.e. returns -1), which would happen in the following cases:
EBADF -- this would happen if someone else did close() system call on the underlying fd, which I would think a rare event.
EINTR -- would happen if the system call was interrupted by a signal, which would be rare. Also, I think we should probably just catch EINTR and re-attempt the close. Unfortunately, we can't do that in OCaml because the OCaml library marks the out_channel as closed even if the close syscall fails, so a subsequent call close_out_channel
will be a no-op. This should really be fixed in the OCaml library C code, having it restart the close() syscall on EINTR. I put a couple CRs in fixed_close_channel
, our rework of OCaml's caml_ml_close_channel
,
EIO -- I don't recall seeing this. I think it's rare.
See "man 2 close" for details.
val set_binary_mode : t -> Base.Bool.t -> Base.Unit.t
val flush : t -> Base.Unit.t
val output :
t ->
buf:Base.String.t ->
pos:Base.Int.t ->
len:Base.Int.t ->
Base.Unit.t
val output_string : t -> Base.String.t -> Base.Unit.t
val output_char : t -> Base.Char.t -> Base.Unit.t
val output_byte : t -> Base.Int.t -> Base.Unit.t
val output_binary_int : t -> Base.Int.t -> Base.Unit.t
val output_buffer : t -> Base.Buffer.t -> Base.Unit.t
val output_value : t -> _ -> Base.Unit.t
OCaml's internal Marshal format
val newline : t -> Base.Unit.t
val output_lines : t -> Base.String.t Base.List.t -> Base.Unit.t
Outputs a list of lines, each terminated by a newline character
val fprintf : t -> ('a, t, Base.Unit.t) Pervasives.format -> 'a
Formatted printing to an out channel. This is the same as Printf.sprintf
except that it outputs to t
instead of returning a string. Similarly, the function arguments corresponding to conversions specifications such as %a
or %t
takes t
as argument and must print to it instead of returning a string.
val printf : ('a, t, Base.Unit.t) Pervasives.format -> 'a
printf fmt
is the same as fprintf stdout fmt
val eprintf : ('a, t, Base.Unit.t) Pervasives.format -> 'a
printf fmt
is the same as fprintf stderr fmt
val kfprintf :
(t -> 'a) ->
t ->
('b, t, Base.Unit.t, 'a) Pervasives.format4 ->
'b
kfprintf k t fmt
is the same as fprintf t fmt
, but instead of returning immediately, passes the out channel to k
at the end of printing.
val print_endline : Base.String.t -> Base.Unit.t
print_endline str
outputs str
to stdout
followed by a newline then flushes stdout
val prerr_endline : Base.String.t -> Base.Unit.t
prerr_endline str
outputs str
to stderr
followed by a newline then flushes stderr
val seek : t -> Base.Int64.t -> Base.Unit.t
val pos : t -> Base.Int64.t
val length : t -> Base.Int64.t
val write_lines : Base.String.t -> Base.String.t Base.List.t -> Base.Unit.t
The first argument of these is the file name to write to.
val write_all : Base.String.t -> data:Base.String.t -> Base.Unit.t