模块 In_channel

module In_channel: sig .. end

输入通道。

此模块提供用于处理输入通道的功能。

请参阅下面的 示例部分


通道

type t = in_channel 

输入通道的类型。

type open_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 以供读取打开命名文件,如上所述。额外参数 modeperm 指定打开模式和文件权限。 In_channel.open_textIn_channel.open_bin 是此函数的特殊情况。

val with_open_bin : string -> (t -> 'a) -> 'a

with_open_bin fn f 在文件 fn 上打开一个通道 ic 并返回 f
    ic
。在 f 返回后,无论是通过值还是通过引发异常,都保证 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 icic 读取字符,直到遇到换行符或文件末尾。返回所有已读取字符的字符串,不包括换行符(如果有)。如果已到达文件末尾,则返回 None。特别是,如果输入的最后一行为空,则将是这种情况。

换行符是字符 \n,除非文件以文本模式打开并且 Sys.win32true,在这种情况下,它是一系列字符 \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 个字符。

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 读取的字节是连续的。

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_lineic 读取行,直到遇到文件末尾,并依次将每行传递给函数 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