getsへのデータの与え方

以下のプログラムを emj.rb という名前で保存して 実行してみよう。

emj.rb

#!/usr/koeki/bin/ruby

print "英語は何点?: "
english = gets.chomp.to_i

print "数学は何点?: "
math = gets.chomp.to_i

print "国語は何点?: "
japanese = gets.chomp.to_i

printf("合計は%d点です\n", english+math+japanese)
% ./emj.rb
英語は何点?: 80
数学は何点?: 66
国語は何点?: 54
合計は200点です

プログラムを普通に起動するとgets メソッド に与えるデータはキーボードから入力することになる。このように入力 が少ない(3個)のデータを一度入力するくらいならキーボードから 入れるのも苦でないが、これを何度も、あるいは大量に手で入れるのは 厳しい。本格的なプログラムに与えるデータはファイルに保存しておく。

emj.rb に与えたのと同じ並びの3つのデータから なるファイル emj.dat を作ろう。

emj.dat

80
66
54

cat コマンドを使って emj.dat ファイルの中味を画面に出力してみる。

% cat emj.dat
80
66
54

ファイルに保存したデータをプログラムの入力として与えること ができる。以下の3つの方法は、どれも emj.dat に保存してあるデー タをRubyプログラムのgetsに与えるためのコマンドラインである。

  1. % ./emj.rb < emj.dat
  2. % cat emj.dat | ./emj.rb
  3. % ./emj.rb emj.dat

上記のいずれかの方法でプログラムを起動すると以下のような 出力画面が得られる。

英語は何点?: 数学は何点?: 国語は何点?: 合計は200点です

一見、画面が乱れてしまったように見えるが正しい結果が出ている。 これは、ファイルの内容が自動的にgetsメソッドに 供給されているからである。

gets メソッドがデータを読む場所は 一概に「キーボード」とは言えないことに注意しておこう。

標準入力と標準出力

Rubyプログラムを起動するとき、プログラム名の後に何も指定しない場合に getsメソッドがデータを読む場所のことを正しくは 標準入力という。Rubyプログラムに限らず、全てのコマンドの 標準入力はファイルや別のプログラムの出力結果に変更することができる。

% ./emj.rb          # 標準入力は端末(キーボード)
% ./emj.rb < file   # 標準入力は file ファイルの中味
% cmd | ./emj.rb    # 標準入力は cmd コマンドの出力結果

Rubyプログラムのprintfメソッドは、通常端末画面に 結果を出力する。プログラムの起動方法を変えるとこの出力先を 変更することができる。

% ./emj.rb          # 標準出力は端末(画面)
% ./emj.rb > file   # 標準出力は file ファイルに保存される
% ./emj.rb | cmd    # 標準出力は cmd コマンドの入力として送られる

本日の目次