• 検索結果がありません。

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?を使ってキーが押されているかど うかを 調べます。もしキー入力があればそれを読むようにすることで、プログラムの実行が入力 待ちで中断しないようにします。