模組 Stdlib.In_channel

module In_channel: In_channel

通道

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。特別地,如果最後一行輸入為空,就會發生這種情況。

除非檔案以文字模式開啟且 Sys.win32true,否則換行符號為字元 \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 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 相同,但將資料讀取到 bigarray 中。

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 相同,但將資料讀取到 bigarray 中。

val fold_lines : ('acc -> string -> 'acc) -> 'acc -> t -> 'acc

fold_lines f init ic 使用 In_channel.input_lineic 讀取行,直到到達檔案結尾,並以 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 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