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
開啟指定的檔案以供讀取,並返回該檔案的新輸入通道,位置在檔案的開頭。
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
。特別地,如果最後一行輸入為空,就會發生這種情況。
除非檔案以文字模式開啟且 Sys.win32
為 true
,否則換行符號為字元 \n
,在這種情況下,它會是字元序列 \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
個字元。
pos
和 len
沒有指定 buf
的有效範圍,則引發 Invalid_argument
。val input_bigarray : t ->
('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t -> int -> int -> int
與 In_channel.input
相同,但將資料讀取到 bigarray 中。
val really_input : t -> bytes -> int -> int -> unit option
really_input ic buf pos len
從通道 ic
讀取 len
個字元,將它們儲存到位元組序列 buf
中,從字元編號 pos
開始。
如果在讀取 len
個字元之前到達檔案結尾,則返回 None
。
如果多個執行緒同時讀取同一個通道,則不保證 really_input
讀取的位元組是連續的。
pos
和 len
沒有指定 buf
的有效範圍,則引發 Invalid_argument
。val really_input_bigarray : t ->
('a, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t -> int -> int -> unit option
與 In_channel.really_input
相同,但將資料讀取到 bigarray 中。
val fold_lines : ('acc -> string -> 'acc) -> 'acc -> t -> 'acc
fold_lines f init ic
使用 In_channel.input_line
從 ic
讀取行,直到到達檔案結尾,並以 fold 的風格依次將每一行傳遞給函式 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