module In_channel:sig
..end
typet =
in_channel
输入通道的类型。
typeopen_flag =
open_flag
=
| |
Open_rdonly |
(* | 打开以供读取。 | *) |
| |
Open_wronly |
(* | 打开以供写入。 | *) |
| |
Open_append |
(* | 打开以供追加:始终写入文件末尾。 | *) |
| |
Open_creat |
(* | 如果文件不存在,则创建文件。 | *) |
| |
Open_trunc |
(* | 如果文件已存在,则清空文件。 | *) |
| |
Open_excl |
(* | 如果 Open_creat 且文件已存在,则失败。 | *) |
| |
Open_binary |
(* | 以二进制模式打开(无转换)。 | *) |
| |
Open_text |
(* | 以文本模式打开(可能会执行转换)。 | *) |
| |
Open_nonblock |
(* | 以非阻塞模式打开。 | *) |
用于 In_channel.open_gen
的打开模式。
val stdin : t
进程的标准输入。
val open_bin : string -> t
打开命名文件以供读取,并返回该文件上的一个新的输入通道,该通道位于文件开头。
val open_text : string -> t
与 In_channel.open_bin
相同,但文件以文本模式打开,以便在读取期间执行换行符转换。在不区分文本模式和二进制模式的操作系统上,此函数的行为与 In_channel.open_bin
相同。
val open_gen : open_flag list -> int -> string -> t
open_gen mode perm filename
以供读取打开命名文件,如上所述。额外参数 mode
和 perm
指定打开模式和文件权限。 In_channel.open_text
和 In_channel.open_bin
是此函数的特殊情况。
val with_open_bin : string -> (t -> 'a) -> 'a
with_open_bin fn f
在文件 fn
上打开一个通道 ic
并返回 f
。在
icf
返回后,无论是通过值还是通过引发异常,都保证 ic
已关闭。
val with_open_text : string -> (t -> 'a) -> 'a
与 In_channel.with_open_bin
相同,但通道以文本模式打开(参见 In_channel.open_text
)。
val with_open_gen : open_flag list -> int -> string -> (t -> 'a) -> 'a
与 In_channel.with_open_bin
相同,但可以指定打开模式和文件权限,以防文件必须创建(参见 In_channel.open_gen
)。
val close : t -> unit
关闭给定的通道。输入函数在应用于已关闭的输入通道时会引发 Sys_error
异常,除了 In_channel.close
,它在应用于已关闭的通道时什么也不做。
val close_noerr : t -> unit
与 In_channel.close
相同,但忽略所有错误。
val input_char : t -> char option
从给定的输入通道读取一个字符。如果不再有字符可读,则返回 None
。
val input_byte : t -> int option
与 In_channel.input_char
相同,但返回表示字符的 8 位整数。如果已到达文件末尾,则返回 None
。
val input_line : t -> string option
input_line ic
从 ic
读取字符,直到遇到换行符或文件末尾。返回所有已读取字符的字符串,不包括换行符(如果有)。如果已到达文件末尾,则返回 None
。特别是,如果输入的最后一行为空,则将是这种情况。
换行符是字符 \n
,除非文件以文本模式打开并且 Sys.win32
为 true
,在这种情况下,它是一系列字符 \r\n
。
val really_input_string : t -> int -> string option
really_input_string ic len
从通道 ic
读取 len
个字符,并将其存储在一个新的字符串中。如果在读取 len
个字符之前遇到文件末尾,则返回 None
。
如果多个线程同时读取同一个通道,则不能保证返回的字符串包含来自输入的连续字符。
val input_all : t -> string
input_all ic
读取 ic
中所有剩余的数据。
如果多个线程同时读取同一个通道,则不能保证返回的字符串包含来自输入的连续字符。
val input_lines : t -> string list
input_lines ic
使用 In_channel.input_line
读取行,直到遇到文件末尾。它返回所有已读取行的列表,按读取顺序排列。终止行的换行符不包含在返回的字符串中。空行产生空字符串。
val input : t -> bytes -> int -> int -> int
input ic buf pos len
从给定的通道 ic
读取最多 len
个字符,并将它们存储在字节序列 buf
中,从字符号 pos
开始。它返回实际读取的字符数,介于 0 到 len
(含)之间。返回值为 0 表示已到达文件末尾。
使用 In_channel.really_input
读取正好 len
个字符。
Invalid_argument
,如果 pos
和 len
未指定 buf
的有效范围。val input_bigarray : t ->
('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t -> int -> int -> int
与 In_channel.input
相同,但将数据读入一个大数组。
val really_input : t -> bytes -> int -> int -> unit option
really_input ic buf pos len
从通道 ic
读取 len
个字符,并将它们存储在字节序列 buf
中,从字符号 pos
开始。
如果在读取 len
个字符之前遇到文件末尾,则返回 None
。
如果多个线程同时读取同一个通道,则不能保证 really_input
读取的字节是连续的。
Invalid_argument
,如果 pos
和 len
未指定 buf
的有效范围。val really_input_bigarray : t ->
('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t -> int -> int -> unit option
与 In_channel.really_input
相同,但将数据读入一个大数组。
val fold_lines : ('acc -> string -> 'acc) -> 'acc -> t -> 'acc
fold_lines f init ic
使用 In_channel.input_line
从 ic
读取行,直到遇到文件末尾,并依次将每行传递给函数 f
,如同折叠一样。更准确地说,如果读取行 l1, ..., lN
,则 fold_lines f init ic
计算 f (... (f (f init l1) l2) ...) lN
。如果 f
没有副作用,则这等效于 List.fold_left f init (In_channel.input_lines ic)
,但更有效,因为它没有构造所有已读取行的列表。
val seek : t -> int64 -> unit
seek chan pos
将通道 chan
的当前读取位置设置为 pos
。这仅对常规文件有效。在其他类型的文件上,行为是未指定的。
val pos : t -> int64
返回给定通道的当前读取位置。对于在 Windows 下以文本模式打开的文件,返回的位置是近似的(由于换行符转换);特别是,使用 In_channel.pos
保存当前位置,然后使用 In_channel.seek
返回此位置将不起作用。为了使此编程习惯用法可靠且可移植,文件必须以二进制模式打开。
val length : t -> int64
返回打开给定通道的常规文件的大小(字符数)。如果通道在非常规文件上打开,则结果毫无意义。返回的大小不会考虑从以文本模式打开的通道读取时可能执行的换行符转换。
val set_binary_mode : t -> bool -> unit
set_binary_mode ic true
将通道 ic
设置为二进制模式:在输入期间不会执行任何转换。
set_binary_mode ic false
将通道 ic
设置为文本模式:根据操作系统,输入期间可能会执行一些转换。例如,在 Windows 下,换行符将从 \r\n
转换为 \n
。
此函数在不区分文本模式和二进制模式的操作系统上没有效果。
val is_binary_mode : t -> bool
is_binary_mode ic
返回通道 ic
是否处于二进制模式(参见 In_channel.set_binary_mode
)。
val isatty : t -> bool
isatty ic
如果 ic
指向终端或控制台窗口,则为 true
,否则为 false
。
读取文件内容
let read_file file = In_channel.with_open_bin file In_channel.input_all
从 stdin 读取一行
let user_input () = In_channel.input_line In_channel.stdin