Ruby ファイルの入出力

Ruby は、カーネル(Kernel)モジュールに実装された I/O 関連のメソッド一式を提供します。すべての I/O メソッドは IO クラスから派生しています。

类 IOすべての基本的なメソッドを提供しています。例えばread、 write、 gets、 puts、 readline、 getcとprintf。

この章では、Ruby で利用可能な基本的な I/O 関数をすべて説明します。より多くの関数については、Ruby のIOクラスを参照してください。

puts文

前の章では、変数に値を代入し、puts文を使用して出力しました。

puts文は、プログラムに変数に格納された値を表示させます。これは各行の末尾に新しい行を追加します。

例

#!/usr/bin/ruby val1 = "This is variable one" val2 = "This is variable two" puts val1 puts val2

上記の例の実行結果は次のとおりです。

This is variable one
This is variable two

gets文

gets文は、STDIN という名前の標準入力からユーザー入力を取得するために使用できます。

例

次のコードは gets 文の使用方法を示しています。このコードは、ユーザーに値の入力を促し、その値は変数 val に格納され、最終的に STDOUT に出力されます。

例

#!/usr/bin/ruby puts "Enter a value :" val = gets puts val

上記の例の実行結果は次のとおりです。

Enter a value :
This is entered value
This is entered value

putc文

とputs文とは異なり、puts文は文字列全体を画面に出力しますが、putc文は、1文字ずつ順に出力するために使用できます。

例

以下のコードの出力は文字 H だけです:

例

#!/usr/bin/ruby str="Hello Ruby!" putc str

上記の例の実行結果は次のとおりです。

H

print文

print文とputs文は似ています。唯一の違いは、puts文は出力内容の後に改行しますが、print文を使用する場合、カーソルは同じ行に位置します。

例

#!/usr/bin/ruby print "Hello World" print "Good Morning"

上記の例の実行結果は次のとおりです。

Hello WorldGood Morning

ファイルのオープンとクローズ

これまで、標準入力と標準出力の読み書きを行ってきました。次に、実際のデータファイルを操作する方法を見ていきます。

File.newメソッド

あなたはFile.newメソッドを使用して...を作成できますFileオブジェクトは、読み取り、書き込み、または読み書きに使用されます。アクセス権限は mode パラメータに依存します。最後に、File.closeメソッドを使用してそのファイルを閉じます。

構文

aFile = File.new("filename", "mode") #... ファイルを処理します aFile.close

File.openメソッド

あなたはFile.openメソッドを使用して、新しい file オブジェクトを作成し、その file オブジェクトをファイルに割り当てることができます。ただし、File.openとFile.newメソッドの間には少し違いがあります。違いは、File.openメソッドはブロックと関連付けることができますが、File.newメソッドはできません。

File.open("filename", "mode") do |aFile| # ... process the file end

次の表は、ファイルを開くためのさまざまなモードを示しています:

モード説明
r読み取り専用モード。ファイルポインタはファイルの先頭に配置されます。これはデフォルトモードです。
r+読み書きモード。ファイルポインタはファイルの先頭に配置されます。
w書き込み専用モード。ファイルが存在する場合は、ファイルを上書きします。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。
w+読み書きモード。ファイルが存在する場合は、既存のファイルを上書きします。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。
a書き込み専用モード。ファイルが存在する場合は、ファイルポインタはファイルの末尾に配置されます。つまり、ファイルは追記モードです。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。
a+読み書きモード。ファイルが存在する場合は、ファイルポインタはファイルの末尾に配置されます。つまり、ファイルは追記モードです。ファイルが存在しない場合は、読み書き用の新しいファイルを作成します。

ファイルの読み書き

単純な I/O のためのメソッドは、すべての file オブジェクトにも使用できます。つまり、gets は標準入力から1行読み取り、aFile.getsfile オブジェクト aFile から1行読み取ります。

ただし、I/O オブジェクトは、アクセス用の追加メソッドを備えており、私たちに利便性をもたらします。

sysreadメソッド

あなたはsysreadメソッドを使用して、ファイルの内容を読み取ることができます。sysread メソッドを使用する場合、任意のモードでファイルを開くことができます。例:

以下は入力テキストファイルです:

This is a simple text file for testing purpose.

では、このファイルを読み取ってみましょう:

例

#!/usr/bin/ruby aFile = File.new("input.txt", "r") if aFile content = aFile.sysread(20) puts content else puts "Unable to open file!" end

この文は、入力ファイルの最初の20文字を読み取ります。ファイルポインタは、ファイル内の21文字目の位置に配置されます。

syswriteメソッド

あなたはsyswriteメソッドを使用して、ファイルに内容を書き込むことができます。syswrite メソッドを使用する場合、書き込みモードでファイルを開く必要があります。例:

例

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") else puts "Unable to open file!" end

この文は、"ABCDEF" をファイルに書き込みます。

each_byteメソッド

このメソッドはクラスFileに属します。メソッドはeach_byte文字列内の各文字を反復処理できます。次のコード例を参照してください:

例

#!/usr/bin/ruby aFile = File.new("input.txt", "r+") if aFile aFile.syswrite("ABCDEF") aFile.rewind aFile.each_byte {|ch| putc ch; putc ?. } else puts "Unable to open file!" end

文字が1つずつ変数 ch に渡され、画面に表示されます。次のようになります:

A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...

IO.readlinesメソッド

类 Fileは IO クラスのサブクラスです。IO クラスには、ファイルを操作するためのメソッドもあります。

IO.readlinesは IO クラス内のメソッドです。このメソッドは、ファイルの内容を1行ずつ返します。次のコードは、メソッドIO.readlinesの使用を示しています:

例

#!/usr/bin/ruby arr = IO.readlines("input.txt") puts arr[0] puts arr[1]

このコードでは、変数 arr は配列です。ファイルinput.txtの各行は配列 arr の要素になります。したがって、arr

IO.foreachメソッド

このメソッドも出力を1行ずつ返します。メソッドforeachとメソッドreadlinesの間の違いは、メソッドforeachがブロックと関連付けられることです。ただし、メソッドとは異なり、readlines、メソッドforeachは配列を返しません。例:

例

#!/usr/bin/ruby IO.foreach("input.txt"){|block| puts block}

このコードは、ファイルtestの内容を変数 block に1行ずつ渡し、その後、出力が画面に表示されます。

ファイルの名前変更と削除

あなたはrenameとdeleteメソッドでファイルの名前変更と削除を行うことができます。

次の例は、既存のファイルの名前を変更しますtest1.txt:

例

#!/usr/bin/ruby #ファイル test1.txt を test2.txt に名前変更します File.rename( "test1.txt", "test2.txt" )

次の例は、既存のファイルを削除しますtest2.txt:

例

#!/usr/bin/ruby #ファイル test2.txt を削除します File.delete("text2.txt")

ファイルモードと所有権

マスク付きのchmodメソッドを使用して、ファイルのモードまたは権限/アクセスリストを変更します:

次の例は、既存のファイルのtest.txtモードをマスク値に変更します:

例

#!/usr/bin/ruby file = File.new( "test.txt", "w" ) file.chmod( 0755 )

次の表はchmodメソッドで使用できるさまざまなマスクを示しています:

マスク説明
0700rwx マスク(所有者向け)
0400r(所有者向け)
0200w(所有者向け)
0100x(所有者向け)
0070rwx マスク(グループ向け)
0040r(グループ向け)
0020w(グループ向け)
0010x(グループ向け)
0007rwx マスク(その他のユーザー向け)
0004r(その他のユーザー向け)
0002w(その他のユーザー向け)
0001x(その他のユーザー向け)
4000実行時にユーザー ID を設定
2000実行時にグループ ID を設定
1000スワップテキストを保存します(使用後も保存されます)

ファイルの照会

次のコマンドは、ファイルを開く前にファイルが既に存在するかどうかを確認します:

例

#!/usr/bin/ruby File.open("file.rb") if File::exists?( "file.rb" )

次のコマンドは、ファイルが実際にファイルであるかどうかを照会します:

例

#!/usr/bin/ruby #true または false を返します File.file?( "text.txt" )

次のコマンドは、指定されたファイル名がディレクトリであるかどうかを確認します:

例

#!/usr/bin/ruby #ディレクトリ File::directory?( "/usr/local/bin" ) # => true #ファイル File::directory?( "file.rb" ) # => false

次のコマンドは、ファイルが読み取り可能、書き込み可能、実行可能かどうかを確認します:

例

#!/usr/bin/ruby File.readable?( "test.txt" ) # => true File.writable?( "test.txt" ) # => true File.executable?( "test.txt" ) # => false

次のコマンドは、ファイルのサイズがゼロかどうかを確認します:

例

#!/usr/bin/ruby File.zero?( "test.txt" ) # => true

次のコマンドは、ファイルのサイズを返します:

例

#!/usr/bin/ruby File.size?( "text.txt" ) # => 1002

次のコマンドは、ファイルのタイプを確認するために使用されます:

例

#!/usr/bin/ruby File::ftype( "test.txt" ) # => file

ftype メソッドは、次のいずれかの値を返すことでファイルのタイプを識別します:file、directory、characterSpecial、blockSpecial、fifo、link、socket、または unknown。

次のコマンドは、ファイルが作成、変更、または最後にアクセスされた時刻を確認するために使用されます:

例

#!/usr/bin/ruby File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008 File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008 File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Rubyにおけるディレクトリ

すべてのファイルはディレクトリに含まれており、Ruby はファイルとディレクトリを処理する方法を提供します。Fileクラスはファイルを処理するために使用され、Dirクラスはディレクトリを処理するために使用されます。

ディレクトリの参照

Ruby プログラムでディレクトリを変更するには、次を使用しますDir.chdir。次の例では、現在のディレクトリを に変更します。/usr/bin。

Dir.chdir("/usr/bin")

次を使用して Dir.pwd現在のディレクトリを確認できます:

puts Dir.pwd #現在のディレクトリを返します。/usr/bin のようなものです

次を使用して、Dir.entries指定されたディレクトリ内のファイルとディレクトリのリストを取得できます:

puts Dir.entries("/usr/bin").join(' ')

Dir.entries指定されたディレクトリ内のすべての項目を含む配列を返します。Dir.foreach同じ機能を提供します:

Dir.foreach("/usr/bin") do |entry| puts entry end

ディレクトリリストを取得するより簡潔な方法は、Dir の配列のようなメソッドを使用することです:

Dir["/usr/bin/*"]

ディレクトリの作成

Dir.mkdirを使用してディレクトリを作成できます:

Dir.mkdir("mynewdir")

mkdir を使用して、新しいディレクトリ(既存のディレクトリではない)に権限を設定することもできます:

注意:マスク 755 は、所有者(owner)、グループ(group)、全員(world [anyone])の権限を rwxr-xr-x に設定します。ここで、r = read(読み取り)、w = write(書き込み)、x = execute(実行)です。

Dir.mkdir( "mynewdir", 755 )

ディレクトリの削除

Dir.deleteを使用してディレクトリを削除できます。Dir.unlinkとDir.rmdir同じ機能を実行し、利便性を提供します。

Dir.delete("testdir")

ファイルの作成 & 一時ディレクトリ

一時ファイルとは、プログラムの実行中に一時的に作成されるが、永続的に保存されない情報のことです。

Dir.tmpdirは現在のシステム上の一時ディレクトリのパスを提供しますが、このメソッドはデフォルトでは使用できません。使用可能にするには、Dir.tmpdir必要な 'tmpdir' を使用する必要があります。

次を一緒に使用して、Dir.tmpdirとFile.joinプラットフォームに依存しない一時ファイルを作成できます:

require 'tmpdir' tempfilename = File.join(Dir.tmpdir, "tingtong") tempfile = File.new(tempfilename, "w") tempfile.puts "This is a temporary file" tempfile.close File.delete(tempfilename)

このコードは一時ファイルを作成し、データを書き込み、ファイルを削除します。Ruby の標準ライブラリには、 という名前のTempfileライブラリも含まれており、一時ファイルの作成に使用できます:

require 'tempfile' f = Tempfile.new('tingtong') f.puts "Hello" puts f.path f.close

組み込み関数

以下に、Ruby でファイルとディレクトリを処理するための組み込み関数の完全なリストを示します:

その他の拡張