Ruby-input-output

提供:Dev Guides
移動先:案内検索

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クラスとメソッド]。