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
如果 ic
指向終端機或主控台視窗,則 isatty 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