ATS 言語で I/O を扱うには依存型と線形型を使う必要があり、これは別の章で解説します。 この章では、プログラマが使うことのできる基本的な I/O へのアクセス手段を解説します。
ファイルハンドルは本質的には (バイト列としての) ストリームと (整数値として表現される) ファイル識別子を結び付けます。 ATS では、ファイルハンドルの型は FILEref です。 次に挙げるような3つの標準ファイルハンドルがあります:
stdin_ref: 標準入力
stdout_ref: 標準出力
stderr_ref: 標準エラー出力
ファイルハンドルに関連する様々な関数が filebas.sats ファイルで宣言されています。 このファイルは atsopt で自動的に読み込まれます。 例えば、 ファイルハンドルのオープンとクローズを行なう関数は次のようなインターフェイスを持っています:
fun fileref_open_exn ( path: string, fm: file_mode ) : FILEref // endfun fun fileref_close (fil: FILEref): void
型 file_mode は次に挙げるようなファイルモードを表わす値です:
file_mode_r: ファイルを読み出しモードで開き、ファイル先頭にストリームを配置します。
file_mode_rr: ファイルを読み書きモードで開き、ファイル先頭にストリームを配置します。
file_mode_w: 与えられたファイルを長さゼロに切り詰めるか、書き込みのために新しいファイルを生成し、 ファイル先頭にストリームを配置します。
file_mode_ww: 与えられたファイルを長さゼロに切り詰めるか、読み書きのために新しいファイルを生成し、 ファイル先頭にストリームを配置します。
file_mode_a: ファイルを書き込みモードで開き、ファイル末尾にストリームを配置します。
file_mode_aa: ファイルを読み書きモードで開き、読み出しストリームをファイル先頭に、 書き込みストリームをファイル末尾に配置します。
例として、次の短かいプログラムはファイルハンドルを開き、 文字列 "Hello, world!" と改行をファイルハンドルに関連するストリームに出力し、 最後にファイルハンドルを閉じます:
implement main0 () = { val out = fileref_open_exn ("hello.txt", file_mode_w) val () = fprint_string (out, "Hello, world!n") val () = fileref_close (out) // } (* end of [main0] *)
別の一般的な I/O 関数として次のようなインターフェイスがあります:
関数 fileref_get_line_string は与えられたファイルハンドルに対応するストリームから1行読み込みます。 そしてその返値は Strptr1 型になります。 さしあたり、このような値は明示的に解放しなければならない文字列のようなものであると、 単純に説明することにとどめます。 例として、次の短かいプログラムは、標準入力から一行読み込み標準出力にエコーします:implement main0 ( // argumentless ) = loop () where { // fun loop (): void = let val isnot = fileref_isnot_eof (stdin_ref) in // if isnot then let val line = fileref_get_line_string (stdin_ref) val ((*void*)) = fprintln! (stdout_ref, line) val ((*void*)) = strptr_free (line) in loop () end else ((*loop exits as the end-of-file is reached*)) // end (* end of [loop] *) // } (* end of [main0] *)