模組 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 icic 讀取所有剩餘資料。

如果多個執行緒同時讀取同一個通道,則無法保證返回的字串包含來自輸入的連續字元。

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

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