6.2 入出力
6.2.4 読み込み
ファイルの読み込みをするときは 、「いまどこを読もうとしているか 」が重要となりま す。「ファイルのどこを読もうとしているか」を表すものを、「ファイルポインタ」といい ます。ファイルをオープンした直後では、ファイルポインタは最初の文字を指しています。
ファイルポインタは、データを読み込むにつれて進められます。図
6.3
に、ファイルポインタの概念図を示します。この図では、内容が Pooh Owlであるファイルの
2
番目の文字にファイルポインタがあります。
ファイルからのデータを読み込みは、以下の
2
通りの方法が用意されています。11ほとんどのオペレーティングシステムでは、ファイルへの入出力と同じ方法で、キーボード や画面に対 する入出力ができるようになっています。
ファイルポインタ
p p p p
ppp pppp ppp pppp pppp ppppp
ppp
pppp
pppp
ppp
pppp
p p p
pp pppp pppp pppp pppp pppp pppp
ppp
pppp
pppp
pppp
p
K a n g a & R o o
K a n g a & R o o
ファイルポインタ
(b) 1
文字読み込んだ後のファイルポインタ(a)
読み込み前のファイルポインタ図
6.4:
文字単位での読み込み「文字」を単位とした読み込み
Scheme
の「式」を単位とした読み込み文字を単位とした読み込みでは、ファイルポインタの指す文字を
1
文字ずつ、順番に読み出してゆきます。図
6.4
では、文字を読む前と読んだ後のファイルポインタを図示してい ます。(
この場合での読み込まれた文字は aです。)
式を単位とした読み込みでは、おおまかに言って次のようにしてデータが読み込まれます。
1.
式として関係ない空白文字を読み飛ばす。2.
空白文字などを読み飛ばした後、最初に現れた文字によって次のような動作をします。コメントの始まりの文字 ;のとき。
行の終り
(
改行文字)
まで読み飛ばします。数字やアルファベット文字のとき。
次の空白文字が現れるまで、数または記号として読み込みます。
二重引用婦 " のとき。
対応する二重引用婦 "に出会うまで、文字列として読み込みます。
開き括弧 (のとき。
対応する閉じ括弧 )に出会うまで読み込みます。
図
6.5
に、式を単位とした読み込みを図示しています。(
何も書かれていない四角は、空白 文字を表しています。)
読み込みのための手続きとして、以下のものがあります。
(c)
式の読み込み(
(A 5)が返される)
pp pppp pppp ppp pppp ppp ppppp
pppp
pppp
ppp
pppp
pp
ppppp
ファイルポインタ
( A 5 )
pp pppp pppp ppp pppp ppp ppppp
pppp
pppp
ppp
pppp
pp
ファイルポインタ
pp pppp pppp ppp pppp ppp ppppp
pppp
pppp
ppp
pppp
pp
ファイルポインタ
ppppp ppppp
(a)
読み込み前の状態(b)
空白の読み飛ばし( A 5 )
( A 5 )
図
6.5:
式単位での読み込み} (read hポート i)
|
hポート iから(Scheme
データとしての)
式を1
つ読み込み、その式を返します。もしポートが与えられなければ 、現在入力ポートから読み込みます。
} (read-char hポート i)
|
hポート iから1
文字読み込んで、文字型のデータを返します。もしポートが与 えられなければ 、現在入力ポートから読み込みます。ファイルは無限に長くはなく、終りがあります。ファイルの終りにたどり着いたときは、
ファイルの終りを表す特別なデータが返されます。この特別なデータをファイル終端子
(end-of-le object)
といいます。ファイルの終りにたどり着いたことは、readや read-charの 返したデータがファイル終端子かど うかを調べることで分かります。} (eof-object? hデータi)
|
hデータiがファイル終端子なら真#t を、そうでなければ偽 #f を返します。文字単位での読み込みに関連して、次のものも用意されています。
} (peek-char hポート i)
|
ファイルポインタを進めずに、hポート iから1
文字読み込み、文字型のデータ を返します。もしポートが与えられなければ 、現在入力ポートから読み込みます。4 (char-ready? hポート i)
|
hポート iで少なくとも1
文字が読み込み可能となっているかを調べます。もし ポートが与えられなければ 、現在入力ポートを調べます。読み込み可能な文字があれ ば真#t を、そうでなければ偽 #f を返します。手続きread-charでキーボードから読む場合を考えます。もしキーが押されていないけ
れば 、read-charはキーが押されるまで待ち、そして押されたキーの文字を返します。こ
れではビデオゲームのように、リアルタイムな動作をするプログラムは作れません。その ようなプログラムでは、まず手続き char-ready?を使ってキーが押されているかど うかを 調べます。もしキー入力があればそれを読むようにすることで、プログラムの実行が入力 待ちで中断しないようにします。