入出力

Rubyにおける標準入出力・ファイル入出力・ファイルやディレクトリの操作について説明します。Rubyで入出力を行う場合は、IOクラスのオブジェクトを介して行われます。

 

標準入出力

Rubyでは標準入出力に対応するIOオブジェクトは定数に格納されています。下はその定数です。

定数名 ファイル
 STDIN  標準入力
 $stdin  標準入力
 STDOUT  標準出力
 $stdout  標準出力
 STDERR  標準エラー出力
 $stderr  標準エラー出力

 

標準入力からデータを受け取るにはgetsを用います。getsは標準入力から行単位で読み込みますが、行末の改行文字を取り除かないので注意してください。

<stdin.rb>

while str = STDIN.gets
break if str.chomp == "exit"
print "input text:", str
end

 

<実行結果> 

C:\ruby>ruby stdin.rb
Hello #キーボードからの入力
input text:Hello
Ruby
input text:Ruby
exit

 

 標準出力・標準エラー出力のメソッドとしてはp, puts, printがあります。
<output.rb>

STDOUT.puts "Output from STDOUT"
STDERR.puts "Output from STDERR"

 

 <実行結果>

C:\ruby>ruby output.rb
Output from STDOUT
Output from STDERR

C:\ruby>ruby output.rb > test.txt
Output from STDERR

getsputsなどはデフォルトでSTDINからの入力、STDOUTへの出力となっているので、レシーバ(STDINやSTDOUT)を省略することができます。

 

ファイル入出力

読み込み用のファイル、または書き込み用のファイルを作成するには、openまたはFile.openを使用し、Fileオブジェクトを作成します。読み書きが終わったらcloseメソッドでファイルを閉じます。以下のように記述します。

io = File.open(ファイル名, モード)
#ファイル処理
io.close


openにブロック(doend)を渡すと、ブロックの処理が終了したらファイルを自動的に閉じます。従って次のようにcloseを呼びだすことなく書くこともできます。

File.open(ファイル名, モード) do |io|
#ファイル処理
end


モードは以下のものが指定できます。デフォルトは"r"(読み込みモード)です。

モード
 説明
 “r”
 読み込みモード
 “w”  書き込みモード。ファイルが存在していればファイルを空にする。
 “a”  書き込みモード。ファイルが存在していれば、ファイルの末尾から追記する。
 “r+”  読み書き両用モード。ファイルの先頭から読み書きを行う。
 “w+”
 読み書き両用モード。ファイルが存在していればファイルを空にする。
 “a+”  読み書き両用モード。ファイルの末尾から読み書きを行う。


ファイルからデータを読み込むメソッドとして、gets, read, readlinesなどがあります。次のコードを参考にしてください。
<file_input.rb>

File.open("data.txt", "r") do |io|
puts "---gets"
p io.gets #1行読み込んで表示

puts "---readline"
p io.readline #1行読み込んで表示

puts "---read"
io.rewind #読み込み位置を先頭に戻す
p io.read(5) #5バイト分読み込んで表示
p io.read #現在位置よりファイル全体を読み込んで表示

puts "---readlines"
io.rewind #読み込み位置を先頭に戻す
p io.readlines #ファイルの各行を要素とする配列を作成して表示
end


<実行結果>

C:\ruby>ruby file_input.rb
---gets
"Ruby\n"
---readline
"Java\n"
---read
"Ruby\n"
"Java\nPython\nPerl"
---readlines
["Ruby\n", "Java\n", "Python\n", "Perl"]


ファイルに書き込むメソッドとしてはprint, puts, writeなどがあります。
<file_output.txt>

File.open("out.txt", "w") do |io|
p io.puts "AAAAA" #文末に改行を入れて書き込む
p io.print "BBBBB" #文末の改行は付けずに書き込む
p io.write "CCCCC" #文末の改行は付けない。書き込んだバイト数を返す
end


<実行結果>

C:\ruby>ruby file_output.rb
nil
nil
5

C:\ruby>type out.txt
AAAAA
BBBBBCCCCC



コマンドライン引数の取得

変数ARGVにはコマンドラインで与えられた引数が配列として格納されています。
<arg.rb>

p ARGV


<実行結果>

C:\ruby>ruby argv.rb ruby python perl java
["ruby", "python", "perl", "java"]


これによってプログラムの外から入出力ファイルを指定することができます。
<file_input2.rb>

File.open(ARGV[0], "r") do |io|
while line = io.gets
puts line
end
end


<実行結果>

C:\ruby>ruby file_input2.rb data.txt
Ruby
Java
Python
Perl

 

 

ファイル・ディレクトリ情報の取得と操作

ファイルやディレクトリ情報の取得や操作は、FileクラスやDirクラスを用いて実行できます。代表的なメソッドについて、irbを通じて紹介します。

C:\ruby>irb
irb(main):001:0> filename = "C:/ruby/data.txt"
=> "C:/ruby/data.txt"
irb(main):002:0> File.basename(filename) #ファイルパスからファイル名取得
=> "data.txt"
irb(main):003:0> File.basename(filename, ".txt") #拡張子を除いて取得
=> "data"
irb(main):004:0> File.extname(filename)  #拡張子の取得
=> ".txt"
irb(main):005:0> File.dirname(filename) #ディレクトリ名取得
=> "C:/ruby"
irb(main):006:0> File.split(filename)   #ディレクトリとファイルを配列に
=> ["C:/ruby", "data.txt"]
irb(main):007:0> File.join("C:/ruby", "data.txt") #ファイルパスを連結
=> "C:/ruby/data.txt"
irb(main):008:0> File.atime(filename)    #ファイルの最終参照時刻
=> 2012-01-23 01:23:45 +0900
irb(main):009:0> File.mtime(filename)    #ファイルの最終修正時刻
=> 2012-01-23 01:23:45 +0900
irb(main):010:0> File.ctime(filename)    #ファイル状態の最終変更時刻
=> 2012-01-23 01:23:45 +0900
irb(main):011:0> File.rename("data.txt", "data2.txt") #ファイル名変更
=> 0
irb(main):012:0> File.exist?("data.txt") #ファイルの存在チェック
=> false
irb(main):013:0> File.exist?("data2.txt")
=> true
irb(main):014:0> File.delete("data2.txt") #ファイルの削除
=> 1
irb(main):015:0> File.exist?("data2.txt")
=> false
irb(main):016:0> Dir.glob("C:/ruby/*.txt") #ファイル一覧の取得
=> ["C:/ruby/out.txt", "C:/ruby/test.txt"]
irb(main):017:0> Dir.mkdir("C:/ruby/temp") #ディレクトリの作成
=> 0
irb(main):018:0> Dir.exist?("C:/ruby/temp") #ディレクトリの存在チェック
=> true
irb(main):019:0> Dir.chdir("C:/ruby/temp") #ディレクトリの移動
=> 0
irb(main):020:0> Dir.pwd                  #カレントディレクトリの表示
=> "C:/ruby/temp"
irb(main):021:0> Dir.chdir("C:/ruby")
=> 0
irb(main):022:0> Dir.rmdir("C:/ruby/temp") #ディレクトリの削除
=> 0
irb(main):023:0> Dir.exist?("C:/ruby/temp")
=> false


次は、Rubyにおけるメソッドの記述方法について説明します。