Rubyファイルの入出力


Ruby は、カーネル モジュールに実装された I/O 関連メソッドの完全なセットを提供します。すべての I/O メソッドは IO クラスから派生します。

クラス IO は、read、write、gets、puts、readline、getcprintf などのすべての基本メソッドを提供します。

この章では、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 と呼ばれる標準画面からユーザー入力を取得するために使用できます。

以下のコードは、get ステートメントの使用方法を示しています。このコードはユーザーに値の入力を要求します。値は変数 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 ステートメントは文字列全体を画面に出力します。 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.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 に使用されるメソッドも、すべてのファイル オブジェクトで使用できます。つまり、gets は標準入力から 1 行を読み取り、aFile.gets はファイル オブジェクト 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 メソッド

classFile はメンバーですクラス IO サブクラスの。 Class 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[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 メソッドを使用して行うことができます。

次の例は、既存のファイル 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 メソッドを示しています 使用可能なさまざまなマスク:

w、所属するグループの場合0010x 、所属するグループ用 0007rwx マスク 、その他用 0004r 、その他用 0002 w 、他の人のために 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、リンク、ソケット、または不明

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

#!/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 を使用して (既存のディレクトリではなく) 新しいディレクトリに権限を設定することもできます:

注: Mask 755 Set owner, group, world [anyone ]) には権限 rwxr-xr-x が含まれます。ここで、r =読み取り、w = 書き込み、x = 実行。

Dir.mkdir( "mynewdir", 755 )

ディレクトリの削除

Dir.deleteを使用してディレクトリを削除できます。 Dir.unlinkDir.rmdir は便宜上同じ機能を実行します。

Dir.delete("testdir")

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

一時ファイルは、プログラムの実行中に単純に作成される情報ですが、永続的に保存されるわけではありません。

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

Dir.tmpdirFile.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 の組み込み関数の完全なリストが提供されています。以下:

  • ファイルクラスとメソッド。

  • Dir クラスとメソッド。

マスク説明
0700オーナー用rwxマスク
0400rオーナー用
0200 w 、オーナー向け
0100x 、向け所有者
0070rwx マスク、所属するグループの場合
0040r 、所属するグループの場合
0020