はじめに

そろそろ入門的な内容に飽きてきましたか?
ここから、やや応用的な部分へと足を踏み入れていきましょう。
これまでは、ほとんどの処理がプログラム内で完結していました。
そこから一歩踏み込んで、外部とやり取りするプログラムを作ってみましょう。
まずは、キーボードとファイルです。
この記事では、Ruby初心者の方向けに、キーボードやファイルの入出力について説明していきます。
外部とやり取りできると面白みが増してくるので、ぜひ自分でも試してみましょう。

キーボードからの入力を受け取る

キーボードからの入力を受け取るには、「getsメソッド」を使います。
”getsメソッド”を使うと、キーボードからの入力を一行の文字列として取得できます。
たとえば、次のような形です。
例:

while(true)
    input = gets
    break if input == "quit"
    puts eval(input)
end

この例は、入力された文字列をRubyプログラムとして実行します。
”evalメソッド”を使うと、文字列をRubyプログラムとして動的に実行できるのです(例:1+1など)。
”while文”を使って無限ループさせているので、”quit”という文字列を入力して終了させます。
また、次のように複数行の入力を受け取ることも可能です。
例:

lines = readlines
puts lines

「readlinesメソッド」は、キーボードからの入力を複数行で取得できます。
状況に応じて、”getsメソッド”と使い分けましょう。

ファイルからテキストを読み取る

次に、ファイルからテキストを読み取る例をみてみましょう。
Rubyでは、すでにファイルとやり取りするメソッドが組み込まれているので、ファイルへの読み書きは簡単です。
例:

File.open("test.txt").each do |line|
    puts line
end

この例では、複数行の文字列が書き込まれたテキストファイル(test.txt)から行ごとにテキストを読み込んで出力しています。
とても簡単ですね。
また、次のようにブロック文を使わずに一行ずつ取得することも可能です。
例:

file = File.open("test.txt")
puts file.gets
puts file.gets
puts file.gets
file.close

先ほどとは異なり、一行目でファイルオブジェクトを取得して変数に割り当てています。
後は、ファイルオブジェクトの「getsメソッド」を呼び出せば一行ずつテキストを取得できます。
最後に「closeメソッド」でファイルを閉じることを忘れないようにしましょう。

ファイルにテキストを書き出す

次は、ファイルへテキストを書き込んでみましょう。
こちらも、次のように簡単にできます。
例:

File.open("test2.txt", "w") do |f|
    f.puts "aaa"
    f.puts "bbb"
    f.puts "ccc"
end

ファイルに書き込む際も、先程と同じくファイルオブジェクトを使います。
ここでは、ブロック文を使ってファイルオブジェクトを扱っているため、”closeメソッド”は不要です。
「openメソッド」の第二引数に、”w”が必要なことに注意しましょう。
これは、ファイルのオープンモードがデフォルトで読み取りのみ(”r”)だからです。
ファイルを開いたら、「putsメソッド」で一行ずつ書き込めます。
なお、改行したくない場合は「writeメソッド」を使います。

文字エンコーディングに注意!

ここまでは、特に「文字エンコーディング」を指定せずに読み書きを行ってきました。
文字エンコーディングとは、文字をバイトで表すための表のようなものです。
「UTF-8」や「EUC-JP」、「Shift-JIS」など複数のエンコーディングがあります。
もし、書き込むときと読み取るときでエンコーディングが違っていると、次のように文字化けを起こします。
例:

File.open("test2.txt", "w:euc-jp") do |f|
    f.puts "123"
    f.puts "abc"
    f.puts "日本語"
end
File.open("test2.txt", "r:utf-8").each do |line|
    puts line
end

この例では、ファイルに”EUC-JP”で書き込み、それを”UTF-8”で読み取っています。
このため、文字コードが共通している数値やアルファベットなどは文字化けしませんが、互換性のない日本語などの文字は文字化けしてしまっています。
このようなことにならないように、読み書き時の文字エンコーディングには注意しましょう。

まとめ

キーボードおよびファイルへの入出力ができるようになりましたか?
外部とやり取りすることで、よりインタラクティブなプログラムが作成できます。
さらに実用的なプログラムに一歩近づきましたね。
これまで学んだことを活かして、簡単なツールなどを作ってみてもよいでしょう。
あなたはどんなプログラムを作ってみたいですか?