カテゴリー
Ruby

IOクラスについて知ろう

この章ではIO クラスとファイルの入出力について説明します。
ファイルの入出力の基本はファイルを開いて、ファイルに書き込んだり、ファイルから読み込んだりして、最後にファイルを閉じます。
ファイルの入出力にはIO クラスのオブジェクト(IO オブジェクト)を使用します。
ではIO クラスを使用して、ファイルを操作する方法について説明します。9 ファイルを開いたり閉じたりする方法は2つあります。99 構文の中のアクセスモードとは「ファイルを読み込み用で開くのか」、「書き込み用で開くのか」、「読み書き両方で開くのか」を文字列で指定したものです。99999 9「ファイル操作の手順の2」のファイルに書き込んだり、ファイルから読み込んだりするには次の表のメソッドを使用します。
以下のメソッドを使って、入力したり、出力したりします。9999
では次の例で「test.dat」からデータを読み込んでみましょう。99 初めにファイルを開きますが、この例では先ほどの基本構文 2でファイルを開いています。
アクセスモードは読み込み専用の9を使用しています。
「オブジェクト.gets 」と言う形式でファイルからデータを読み込むことができます。
getsメソッドはファイルの中の1行分を読み込むことが出来ますので、「abcde」だけを読み込み、ファイルの終わり(EOF)になるとnilを返します。
最後に9という形式でファイルを閉じます。
基本構文2でファイルを開いた場合にはcloseメソッドは省略できます。
先ほどの例では1行しか取り出さないので、すべての要素を取り出したい場合はwhileを使用します。
次の例のようにwhileを使うと「abcde」「efgh」のすべてが取り出せます。
「a.gets」で取り出されたデータがbに入り、それをprintで出力しています。9
次の例をみてみましょう。99 readlineメソッドもgetsと同じでファイルの中の1行分だけ読み込むことが出来ます。
基本構文は9です。
次の例をみてみましょう。99 9と言う形式で、ファイルのすべての行を配列(この例ではb)に格納してくれます。
それを eachメソッド で繰り返し取り出しています。
結果は以下の通りです。9
次の例をみてみましょう。
9
「IOオブジェクト.getc 」という形式でファイルから1文字ずつ読み込みます。
このメソッドはファイルの終わり(EOF)になるとnilを返します。9
次の例をみてみましょう。9 基本構文は9です。
ファイルの初めから終わりまでを読み込んで出力します。
ファイルの終端に達するとnil を返します。9
次は9という構文でサイズを入力し、そのサイズ分だけファイルからデータを取り出します。9 この例では2バイト分だけ読み込んでいるので、結果は「ab」です。

次の例をみてみましょう。99 と言う基本構文でファイルの中身をすべて読み込むことが出来ます。9
次はファイルに書き込むメソッドについて説明します。
では例をみてみましょう。9 =>9と言う形式でファイルに改行を入れて書き込むことが出来ます。
これでt.datに「abcdef」「aiueo」が改行を入れて書き込まれます。
次の例をみてみましょう。9
9と言う形式でファイルに改行を入れないで書き込むことが出来ます。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次の例をみてみましょう。9 9と言う形式でファイルに改行を入れないで書き込むことが出来ます。
結果はt.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
writeメソッドを使って、改行を入れて書き込みたい場合には以下の通り、9を入れます。9

次の例をみてみましょう。9 9と言う形式でファイルに書き込むことが出来ます。
結果はte.datに「abcdefaiueo」のように改行を入れないで書き込まれました。
次はファイルポインタについて説明します。
ファイルのデータを読み書きするには「ここまで読んだから次はここから読む」もしくは「ここまで書いたから次はここから書く」のように位置を覚えておかなくてはいけませんが、プログラマ自身が覚えている必要はなく、ファイルポインタと言う位置情報にこのデータが記録されています。
次の例をみてみましょう。9 「IOオブジェクト.pos」と言う形式で、現在のファイル位置を得ることが出来ます。
2バイト読み込んだので、現在のファイルの位置は2の箇所にあります。
例の実行結果は「ab」と「2」を出力します。
またposは現在の位置を知るだけでは無くて、任意の位置に移動することが出来ますので次の例で説明します。99 移動したい場合は9と記述します。
「i.pos=5」は5バイトだけ移動します。
5バイトで出力すると「fgh」を出力します。
「i.pos=0」は先頭まで移動します。先頭まで移動したので「abcdefgh」を出力します。
次はファイルポインタを移動するseekメソッドについて説明します
では例をみてみましょう。99 9で、ファイルポインタを自由に移動させることができます。
第 2引数のwhenceには以下の3種類から選択して、ファイルポインタの動きを決めることが出来ます。9 では例の説明をします。
「i.read(2)」で2のサイズだけ動いていて、その後に9でさらに5のサイズだけ移動しているので9で現在の位置を見ると7になります。
7進んだ位置で出力すると「h」を出力します。
9のように9に変更したとしますと、これは絶対位置なので9で現在の位置を見ると5になります。9
次はrewindメソッドについて説明します。
rewindメソッドはファイルポインタを先頭に戻します。
では例をみてみましょう。999と言う形式でファイルポインタを先頭に戻します。
puts i.posで出力すると0が出力されます。9

カテゴリー
Perl

ハッシュに関する関数を知ろう

この章ではハッシュの要素に対して、様々な操作をする関数について説明します。
以下が主な関数です。11 では例をみてみましょう。1 1ではkeysについて説明します。1 ハッシュに含まれるキーだけを取り出すにはkeysを使用します。
keysはハッシュに含まれるすべてのキーをリストにして返します。
返されるキーには順番はなく、ランダムにリストに格納されます。
上の例では2つの方法でキーを出力しています。
1つ目の方法はforeachです。
foreachは配列の要素を取り出すのに使いますが、ここではハッシュに含まれるすべてのキーのリストを取り出すのに使います。
2つ目の方法はキーのリストを@keyに入れて、printで出力しています。
では次の例をみてみましょう。111 ハッシュに含まれる値だけを取り出すにはvaluesを使用します。valuesはハッシュに含まれるすべての値をリストにして返します。
返される値には順番はなくランダムにリストに格納されます。
先ほどの例では2つの方法で値を出力しています。
1つ目はforeachです。
foreachは配列の要素を取り出すのに使いますが、ここではハッシュにあるすべての値を取り出すのに使います。
2つ目は値のリストを@valueに入れて、printで出力しています。
次は配列の章でも説明したsort関数について説明しますが、詳しくは配列の章のsort関数の説明を参考にしてください。1 では例をみてみましょう。1 キーを文字列で比較する場合にはcmpを使用します。
1キーを数値として比較したい場合には1を使用します。
11次はハッシュの値をソートする方法について説明します。
1では例をみてみましょう。
1値を数値で比較するので、1を使用します。1
次はeach関数について説明します。1 each関数はハッシュに含まれるキーと値のペアを取り出して、キーと値のペアを返します。
ハッシュの最初のキーと値を取り出しています。
ハッシュは要素間の順番がないので、初めの1が出力されるわけではないので注意してください。
では例をみてみましょう。
11次はexists関数について説明します。
1ハッシュの中に指定したキーが存在するかを確認します。
存在する場合はTRUEを返し、存在していなければFALSEを返します。
キーだけを調べているので、次の例のように値にデータが入っていなくてもTRUEを返します。
1結果は「定義されています」です。
すべてのハッシュのキーに対して、存在するのかチェックしたい場合にはforeach文と一緒にif文でチェックを行います。
11次はdefined関数について説明します。
1defined関数は値が定義されている場合はTRUEを、定義されていない場合はFALSEを返します。
値がカラであるならばFALSEになります。
では例をみてみましょう。
1この例では1の値がカラです。
その場合にはFALSEを返します。
FALSEなので1が実行されます。

次はdelete関数について説明します。
1delete関数は引数に指定したキーと値を削除します。
戻り値は削除が出来たのならばその削除した値になります。1 1このようにprintで %nameの要素を出力することが出来ますが、ハッシュをダブルクォートで囲まないでください。
次はハッシュを初期化する方法について説明します。
11ハッシュの要素を初期化するには、上の例のように空のリストを代入します。
ハッシュにカラのリストを代入することにより、ハッシュの要素がすべて削除されます。
「%name=();」でハッシュの要素を初期化したので、上の例を出力しようとしても何も出力されません。