module In_channel: In_channel
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
打开名为 filename 的文件以进行读取,并在该文件上返回一个新的输入通道,该通道位于文件开头。
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
以读取方式打开名为 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
从标准输入读取一行
let user_input () = In_channel.input_line In_channel.stdin