上京エンジニアの葛藤

都会に染まる日々

「初めてのRuby」を読んだ(5章)

今回は 5章「入出力」についてまとめます

ちなみに、前回は 4章「文字列」について書きました
前回の記事はこちら

入出力について

プログラム実行時の引数

Ruby プログラムを動かす時に外部から引数を ARGV で受け取ることができる

# sample1.rb
a = ARGV
puts a

$ sample1.rb hoge
hoge

ファイルの入出力

File の IO は File オブジェクトで扱うことができ、以下のように書ける

# tmp/test1.txt
a
b
c

# sample2.rb
File.open("tmp/test1.txt") {|f|
  contents = f.read
  puts contents
}

$ ruby sample2.rb
a
b
c

このコードのように File.open でファイルを開く時にブロックを取ると、明示的に close しなくてもブロックを抜ける時にファイルを閉じてくれる
もちろん手動で管理することもできる

ファイルを操作時は、いくつかモードがあり、指定がなければデフォルトの 読み取り専用 になる

  • 読み取り専用
  • 書き込み専用
  • 読み書き両用(新規作成は無し、既存内容は破棄して追記しない)
  • 読み書き両用(新規作成は有り、既存内容は破棄して追記しない)
  • 読み書き両用(新規作成は有り、追記する)
  • 追記専用(新規作成は有り、追記する)
  • バイナリモード
# sample3.rb
File.open("tmp/test1.txt", "a+") {|f|
  f.puts "d\ne\nf"
}


$ ruby sample.rb
$ cat test1.txt
a
b
c
d
e
f

また、事前に定義されている定数のビット和を組み合わせて指定することで、細かく設定することもできる

ファイル全部を読み込むのではなくて、1行ごとバイトごとに読み込むことも可能である

# sample4.rb
File.open("tmp/test1.txt", "r") {|f|
  f.each_line do |l|
    puts "#{f.lineno}: #{l}"
  end
}

$ ruby sample4.rb
1: a
2: b
3: c
4: d
5: e
6: f

each_line, each_byte では順アクセスしかできないので、ランダムアクセスしたい場合はバイト位置を操作する必要がある

標準入出力

標準入力 $stdin、標準出力 $stdout標準エラー出力 $stderr で扱うことができる

エンコーディング

外部エンコーディングは、外部リソースを読み書きする際に指定することができる
指定をしなければプロセスのデフォルトのエンコーディングに従い、Encoding.default_external で参照することができる
また default_external はプロセスを起動するときに指定できる

内部エンコーディングは、ファイルを通じて読み書きする文字列のためのエンコーディングである
デフォルトは nil で読み書きするデータは変更されない



以上、今回はボリュームが少なめ!!!