Ruby-input-output
Ruby-ファイルI/O
Rubyは、Kernelモジュールに実装されたI/O関連のメソッドのセット全体を提供します。 すべてのI/Oメソッドは、クラスIOから派生しています。
クラス_IO_は、read、write、gets、puts、readline、getc、、_ printf_などのすべての基本メソッドを提供します。
この章では、Rubyで利用可能なすべての基本的なI/O関数について説明します。 その他の機能については、Ruby Class _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_ステートメントとは異なり、_putc_ステートメントは一度に1文字を出力するために使用できます。
例
次のコードの出力は、文字Hです-
#!/usr/bin/ruby
str = "Hello Ruby!"
putc str
これは、次の結果を生成します-
H
印刷ステートメント
_print_ステートメントは_puts_ステートメントに似ています。 唯一の違いは、_puts_ステートメントは内容を印刷した後に次の行に移動するのに対して、_print_ステートメントではカーソルが同じ行に配置されることです。
例
#!/usr/bin/ruby
print "Hello World"
print "Good Morning"
これは、次の結果を生成します-
Hello WorldGood Morning
ファイルの開閉
これまで、標準入出力の読み取りと書き込みを行ってきました。 ここで、実際のデータファイルを再生する方法を見ていきます。
File.newメソッド
モード文字列に応じて、_File.new_メソッドを使用して読み取り、書き込み、またはその両方を行う_File_オブジェクトを作成できます。 最後に、_File.close_メソッドを使用してそのファイルを閉じることができます。
構文
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
File.openメソッド
_File.open_メソッドを使用して、新しいファイルオブジェクトを作成し、そのファイルオブジェクトをファイルに割り当てることができます。 ただし、_File.open_メソッドと_File.new_メソッドには1つの違いがあります。 違いは、_File.open_メソッドをブロックに関連付けることができますが、_File.new_メソッドを使用して同じことを実行できないことです。
File.open("filename", "mode") do |aFile|
# ... process the file
end
____これは、ファイルを開くさまざまなモードのリストです-
Sr.No. | Modes & Description |
---|---|
1 |
r 読み取り専用モード。 ファイルポインタはファイルの先頭に置かれます。 これがデフォルトのモードです。 |
2 |
r+ 読み書きモード。 ファイルポインタはファイルの先頭にあります。 |
3 |
w 書き込み専用モード。 ファイルが存在する場合はファイルを上書きします。 ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。 |
4 |
w+ 読み書きモード。 ファイルが存在する場合、既存のファイルを上書きします。 ファイルが存在しない場合、読み取りおよび書き込み用の新しいファイルを作成します。 |
5 |
a 書き込み専用モード。 ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。 つまり、ファイルは追加モードになっています。 ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。 |
6 |
a+ 読み取りおよび書き込みモード。 ファイルが存在する場合、ファイルポインタはファイルの末尾にあります。 ファイルが追加モードで開きます。 ファイルが存在しない場合、読み取りおよび書き込み用の新しいファイルが作成されます。 |
ファイルの読み書き
「単純な」I/Oに使用してきたのと同じメソッドが、すべてのファイルオブジェクトに使用できます。 したがって、getsは標準入力から行を読み取り、_aFile.gets_はファイルオブジェクトaFileから行を読み取ります。
ただし、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.each_byte {|ch| putc ch; putc ?. }
else
puts "Unable to open file!"
end
文字は変数chに1つずつ渡され、次のように画面に表示されます-
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クラスメソッドの1つは_IO.readlines_です。 このメソッドは、ファイルの内容を1行ずつ返します。 次のコードは、メソッド_IO.readlines_の使用を表示します-
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
このコードでは、変数arrは配列です。 ファイル_input.txt_の各行は、配列arrの要素になります。 したがって、arr [0]には最初の行が含まれ、arr [1]にはファイルの2行目が含まれます。
IO.foreachメソッド
このメソッドは、行ごとに出力も返します。 メソッド_foreach_とメソッド_readlines_の違いは、メソッド_foreach_がブロックに関連付けられていることです。 ただし、メソッド_readlines_とは異なり、メソッド_foreach_は配列を返しません。 たとえば-
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
このコードは、ファイル_test_の内容を1行ずつ変数ブロックに渡し、出力が画面に表示されます。
ファイルの名前変更と削除
_rename_および_delete_メソッドを使用して、Rubyを使用してプログラムでファイルの名前を変更したり削除したりできます。
以下は、既存のファイル_test1.txt_の名前を変更する例です-
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )
以下は、既存のファイル_test2.txt_を削除する例です-
#!/usr/bin/ruby
# Delete file test2.txt
File.delete("test2.txt")
ファイルモードと所有権
マスクを使用して_chmod_メソッドを使用して、ファイルのモードまたは権限/アクセスリストを変更します-
以下は、既存のファイル_test.txt_のモードをマスク値に変更する例です-
#!/usr/bin/ruby
file = File.new( "test.txt", "w" )
file.chmod( 0755 )
____次は、_chmod_メソッドに異なるマスクを選択するのに役立つテーブルです-
Sr.No. | Mask & Description |
---|---|
1 |
0700 所有者のrwxマスク |
2 |
0400 所有者のr |
3 |
0200 所有者のw |
4 |
0100 所有者のx |
5 |
0070 グループのrwxマスク |
6 |
0040 グループのr |
7 |
0020 グループのw |
8 |
0010 グループのx |
9 |
0007 その他のrwxマスク |
10 |
0004 他のr |
11 |
0002 他のw |
12 |
0001 xはその他 |
13 |
4000 実行時にユーザーIDを設定する |
14 |
2000 実行時にグループIDを設定 |
15 |
1000 使用後でも、交換したテキストを保存する |
ファイル問い合わせ
次のコマンドは、ファイルを開く前に存在するかどうかをテストします-
#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )
次のコマンドは、ファイルが実際にファイルであるかどうかを照会します-
#!/usr/bin/ruby
# This returns either true or false
File.file?( "text.txt" )
次のコマンドは、指定されたファイル名がディレクトリであるかどうかを調べます-
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
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 # This will return something like/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は、パーミッションの所有者、グループ、ワールド[誰でも]をrwxr-xr-xに設定します(r =読み取り、w =書き込み、x =実行)。
Dir.mkdir( "mynewdir", 755 )
ディレクトリを削除する
_Dir.delete_を使用して、ディレクトリを削除できます。 _Dir.unlink_と_Dir.rmdir_はまったく同じ機能を実行し、便宜上提供されています。
Dir.delete("testdir")
ファイルと一時ディレクトリの作成
一時ファイルとは、プログラムの実行中に短時間作成される可能性のあるファイルですが、情報の永続的な保存場所ではありません。
_Dir.tmpdir_は、現在のシステム上の一時ディレクトリへのパスを提供しますが、このメソッドはデフォルトでは使用できません。 _Dir.tmpdir_を使用可能にするには、require 'tmpdir’を使用する必要があります。
_File.join_で_Dir.tmpdir_を使用して、プラットフォームに依存しない一時ファイルを作成できます-
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/ruby_file_methods [ファイルクラスとメソッド]。
- リンク:/ruby/ruby_dir_methods [Dirクラスとメソッド]。