この章ではIO クラスとファイルの入出力について説明します。
ファイルの入出力の基本はファイルを開いて、ファイルに書き込んだり、ファイルから読み込んだりして、最後にファイルを閉じます。
ファイルの入出力にはIO クラスのオブジェクト(IO オブジェクト)を使用します。
ではIO クラスを使用して、ファイルを操作する方法について説明します。
以下のメソッドを使って、入力したり、出力したりします。
では次の例で「test.dat」からデータを読み込んでみましょう。
アクセスモードは読み込み専用の
「オブジェクト.gets 」と言う形式でファイルからデータを読み込むことができます。
getsメソッドはファイルの中の1行分を読み込むことが出来ますので、「abcde」だけを読み込み、ファイルの終わり(EOF)になるとnilを返します。
最後に
基本構文2でファイルを開いた場合にはcloseメソッドは省略できます。
先ほどの例では1行しか取り出さないので、すべての要素を取り出したい場合はwhileを使用します。
次の例のようにwhileを使うと「abcde」「efgh」のすべてが取り出せます。
「a.gets」で取り出されたデータがbに入り、それをprintで出力しています。
次の例をみてみましょう。
基本構文は
次の例をみてみましょう。
それを eachメソッド で繰り返し取り出しています。
結果は以下の通りです。
次の例をみてみましょう。
このメソッドはファイルの終わり(EOF)になるとnilを返します。
次の例をみてみましょう。
ファイルの初めから終わりまでを読み込んで出力します。
ファイルの終端に達するとnil を返します。
次は
次の例をみてみましょう。
次はファイルに書き込むメソッドについて説明します。
では例をみてみましょう。
これでt.datに「abcdef」「aiueo」が改行を入れて書き込まれます。
次の例をみてみましょう。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次の例をみてみましょう。
結果はt.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
writeメソッドを使って、改行を入れて書き込みたい場合には以下の通り、
次の例をみてみましょう。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次はファイルポインタについて説明します。
ファイルのデータを読み書きするには「ここまで読んだから次はここから読む」もしくは「ここまで書いたから次はここから書く」のように位置を覚えておかなくてはいけませんが、プログラマ自身が覚えている必要はなく、ファイルポインタと言う位置情報にこのデータが記録されています。
次の例をみてみましょう。
2バイト読み込んだので、現在のファイルの位置は2の箇所にあります。
例の実行結果は「ab」と「2」を出力します。
またposは現在の位置を知るだけでは無くて、任意の位置に移動することが出来ますので次の例で説明します。
「i.pos=5」は5バイトだけ移動します。
5バイトで出力すると「fgh」を出力します。
「i.pos=0」は先頭まで移動します。先頭まで移動したので「abcdefgh」を出力します。
次はファイルポインタを移動するseekメソッドについて説明します
では例をみてみましょう。
第 2引数のwhenceには以下の3種類から選択して、ファイルポインタの動きを決めることが出来ます。
「i.read(2)」で2のサイズだけ動いていて、その後に
7進んだ位置で出力すると「h」を出力します。
次はrewindメソッドについて説明します。
rewindメソッドはファイルポインタを先頭に戻します。
では例をみてみましょう。
puts i.posで出力すると0が出力されます。