IO

IO クラスは基本的な入出力機能を実装します。

スーパークラス:

インクルードされているモジュール:

クラスメソッド:

IO.new(fd[, mode])
IO.for_fd(fd[, mode]) ((<ruby 1.7 feature>))

オープン済みのファイルディスクリプタ fd に対する新しい IO オブジェクトを生成して返します。IO オブジェクトの生 成に失敗した場合は例外 Errno::EXXX が発生します。

mode には、File.open と同じ形式で IO のモードを指 定します(ただし、文字列形式のみ)。 mode のデフォルト値は "r" です。

IO.foreach(path[, rs]) {|line| ... }

path で指定されたファイルの各行に対して繰り返します (open と同様 path の先頭が "|" ならば、コマ ンドの出力を読み取ります)。ちょうど以下のような働きをします。

port = open(path)
begin
  port.each_line {|line|
     ...
  }
ensure
  port.close
end

path のオープンに成功すれば nil を返します。 失敗した場合は例外 Errno::EXXX が発生します。

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

IO.pipe

pipe(2) を実行して、相互につながった2つの IO オブジェクトを要素とする配列を返します。IO オブジェ クトの作成に失敗した場合は例外 Errno::EXXX が発生します。

返り値の配列は最初の要素が読み込み側で、次の要素が書き込み側です。

p pipe = IO.pipe    # => [#<IO:0x401b90f8>, #<IO:0x401b7718>]
pipe[1].puts "foo"
p pipe[0].gets      # => "foo\n"
IO.popen(command [, mode])
IO.popen(command [, mode]) {|io| ... }

command をサブプロセスとして実行し、そのプロセスの標準入出力 との間にパイプラインを確立します。mode はオープンする IO ポー トのモードを指定します(mode の詳細は open 参照)。省略されたときのデフォルトは "r" です。

生成したパイプ(IO オブジェクト)を返します。

p io = IO.popen("cat", "r+")  # => #<IO:0x401b75c8>
io.puts "foo"
p io.gets  # => "foo\n"

ブロックが与えられた場合は生成した IO オブジェクトを引数にブ ロックを実行し、その結果を返します。ブロックの実行後、生成したパイ プは自動的にクローズされます。

p IO.popen("cat", "r+") {|io|
  io.puts "foo"
  io.gets
}
# => "foo\n"

コマンド名が "-" の時、Ruby は fork(2) を 行い子プロセスの標準入出力との間にパイプラインを確立します。このと きの戻りは、親プロセスは IO オブジェクトを返し、子プロセスは nil を返します。ブロックがあれば、親プロセスは生成した IO オブジェクトを引数にブロックを実行しその結果を返します。 (パイプはクローズされます) 子プロセスは nil を引数にブロックを実行し終了します。

# ブロックなしの例

io = IO.popen("-", "r+")
if io.nil?
  # child
  s = gets
  print "child output: " + s
  exit
end

# parent
io.puts "foo"
p io.gets                   # => "child output: foo\n"
io.close

# ブロックありの例

p IO.popen("-", "r+") {|io|
  if io
    # parent
    io.puts "foo"
    io.gets
  else
    # child
    s = gets
    puts "child output: " + s
  end
}
# => "child output: foo\n"

パイプ、あるいは子プロセスの生成に失敗した場合は例外 Errno::EXXX が発生します。

IO.read(path,[length,[offset]]) ((<ruby 1.7 feature>))

path で指定されたファイルを offset 位置から length バイト分読み込んで返します。ちょうど以下のような働き をします。

port = open(path)
port.pos = offset if offset
begin
  port.read length
ensure
  port.close
end

lengthnil であるか省略した場合には、EOF まで読み込 みます。

IO が既に EOF に達していれば nil を返します。

path のオープン、offset 位置への設定、ファイルの読み込 みに失敗した場合は例外 Errno::EXXX が発生します。 length が負の場合、例外 ArgumentError が発生します。

IO.readlines(path[, rs])

path で指定されたファイルを全て読み込んで、その各行を要素と してもつ配列を返します。 IO が既に EOF に達していれば空配列 [] を返します。

ちょうど以下のような働きをします。

port = open(path)
begin
  port.readlines
ensure
  port.close
end

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

path のオープン、ファイルの読み込みに失敗した場合は例外 Errno::EXXX が発生します。

IO.select(reads[, writes[, excepts[, timeout]]])

select(2) を実行します。 reads/writes/exceptsには、入力待ちする IO (またはそのサブクラス)のインスタンスの配列を渡します。

timeout は整数、Float または nil(省略 時のデフォルト値)を指定します。nil を指定した時に は IO がレディ状態になるまで待ち続けます。

戻り値は、timeout した時には nil を、そうで ないときは 3 要素の配列を返し、その各要素が入力/出力/例外 待ちのオブジェクトの配列です(指定した配列のサブセット)。

select と同じです。

IO.sysopen(path[, mode [, perm]]) ((<ruby 1.7 feature>))

pathで指定されるファイルをオープンし、ファイル記述子を返しま す。ファイルのオープンに失敗した場合は例外 Errno::EXXX が発 生します。

引数 mode, perm については 組込み関数 open と同じです。

IO.for_fd などで IO オブジェクトにしない限り、このメソッ ドでオープンしたファイルをクローズする手段はありません。*1

メソッド:

self << object

object を出力します。object が文字列でない時にはメソッ ド to_s を用いて文字列に変換します。self を戻り値とす るので、以下のような << の連鎖を使うことができます。

$stdout << 1 << " is a " << Fixnum << "\n"

出力に失敗した場合は例外 Errno::EXXX が発生します。

binmode

ストリームをバイナリモードにします。MSDOS などバイナリモードの存在 する OS でのみ有効です(そうでない場合このメソッドは何もしません)。 バイナリモードから通常のモードに戻す方法は再オープンしかありません。

self を返します。

clone
dup

レシーバと同じ IO を参照する新しい IO オブジェクトを返します。 (参照しているファイル記述子は dup(2) されます) clone の際に self は一旦 flush されます。

フリーズした IO の clone は同様にフリーズされた IO を返しますが、 dup は内容の等しいフリーズされていない IO を返します。

close

入出力ポートをクローズします。以後のこのポートに対する入出力 操作は例外を発生します。ガーベージコレクトの際にはクローズさ れていないIOポートはクローズされます。 Traps:closeをGCにまかせる

self がパイプでプロセスにつながっていれば、そのプロセスの終 了を待ち合わせます。

nil を返します。

close_read

読み込み用の IO を close します。主にパイプや読み書き両用に作成し た IO オブジェクトで使用します。

self が読み込み用にオープンされていなければ、例外 IOError が発生します。

nil を返します。

close_write

書き込み用の IO を close します。

self が書き込み用にオープンされていなければ、例外 IOError が発生します。

nil を返します。

closed?

ポートがクローズされている時に真を返します。

each([rs]) {|line| ... }
each_line([rs]) {|line| ... }

IO ポートから 1 行ずつ読み込んで繰り返すイテレータ。IO ポートはリー ドモードでオープンされている必要があります(open参 照)。

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

self を返します。

each_byte {|ch| ... }

IO ポートから 1 バイトずつ読み込みます。IO ポートはリードモードで オープンされている必要があります(open参照)。

self を返します。

eof
eof?

ストリームがファイルの終端に達した場合真を返します。

fcntl(cmd[, arg])

IOに対してシステムコール fcntl を実行します。 機能の詳細はfcntl(2)を参照してください。

arg が整数の時にはその値を、true または false の場合はそれぞ れ 1 または 0 を、文字列の場合には pack した構造体だとみなしてその まま fcntl(2) に渡します。arg の省略時の値 は 0 です。

cmd に対して指定できる値は、添付ライブラリ fcntl.soFcntl モジュールが提供しています。

fcntl(2) が返した数値を返します。fcntl(2) の実行に失敗 した場合は例外 Errno::EXXX が発生します。

fsync ((<ruby 1.7 feature>))

書き込み用の IO に対して、システムコールfsync(2) を実行します。flushを行ったあと(OSレベルで)まだディスクに 書き込まれていないメモリ上にあるデータをディスクに書き出します。

成功すれば 0 を返します。失敗した場合は例外 Errno::EXXX が発 生します。self が書き込み用でなければ例外 IOError が発 生します。

fileno
to_i

ファイル記述子の番号を返します。

flush

IO ポートの内部バッファをフラッシュします。 self が書き込み用でなければ例外 IOError が発 生します。

self を返します。

getc

IO ポートから 1 文字読み込んで、その文字に対応する Fixnum を 返します。EOF に到達した時には nil を返します。

gets([rs])

一行読み込んで、読み込みに成功した時にはその文字列を返します。 ファイルの終りに到達した時には nil を返します。 IO#each と同じように動作します が、こちらは 1 行返すだけで繰り返しません。

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

IO#getsgets 同様、読み込んだ文字列を変数 $_ にセットします。

ioctl(cmd[, arg])

IO に対してシステムコール ioctl を実行します。 機能の詳細はioctl(2)を参照してください。

argが整数の時にはその値を、文字列の場合にはpackした構造体だ とみなしてioctl(2)に渡します。argの 省略時の値は0です。

isatty
tty?

入出力ポートがttyに結合している時、真を返します。

lineno

現在の行番号を返します。

lineno=number

行番号をセットします。

pid

IO.popen で作られたIOポートなら、子プロセスのプロセス ID を 返します。それ以外は nil を返します。

pos
tell

ファイルポインタの現在の位置を返します。

pos = n

ファイルポインタを指定位置に移動します。 io.seek(pos, IO::SEEK_SET)と同じです。

print([arg[, ...]])

引数を IO ポートに順に出力します。引数を省略した場合は、 $_ を出力します。 引数の扱いは print と同じです(詳細はこちらを参照 してください)。

nil を返します。

printf(format[, arg[, ...]])

C 言語の printf と同じように、format に従い引数 を文字列に変換して、self に出力します。

第一引数に IO を指定できないこと、引数を省略できないことを除 けば printf と同じです。 引数の扱いの詳細については sprintfフォーマット を参照してください。

nil を返します。

putc(ch)

文字 chself に出力します。 引数の扱いは putc と同じです(詳細はこちらを参照し てください)。

ch を返します。

puts([obj[, ...]])

objself に出力した後、改行します。 引数の扱いは puts と同じです(詳細はこちらを参照し てください)。

nil を返します。

read([length])

length バイト読み込んで、その文字列を返します。 length が省略された時には、EOF までの 全てのデータを読み込みます。

IO が既に EOF に達していれば nil を返します。

データの読み込みに失敗した場合は例外 Errno::EXXX が発生しま す。length が負の場合、例外 ArgumentError が発生します。

readchar

IO#getc と同様に 1 文字読み込んで、その文字に対応す る Fixnum を返しますが、EOF に到達した時に例外 EOFError を発生させます。

readline([rs])

IO#gets と同様に 1 行読み込みその文字列を返しますが、 EOF に到達した時に例外 EOFError を発生させます。

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

readlinegets 同様読み込んだ文字列を変数 $_ にセットします。

readlines([rs])

データを全て読み込んで、その各行を要素としてもつ配列を返します。 IO が既に EOF に達していれば空配列 [] を返します。

行の区切りは引数 rs で指定した文字列になります。rs の デフォルト値はシステム変数 $/ の値です。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

reopen(io)
reopen(name[, mode])

自身を io に繋ぎ換えます。クラスも io に等しくなります (注意)。

第 1 引数が文字列の時、name で指定されたファイルにストリーム を繋ぎ換えます。

self を返します。

rewind

ファイルポインタを先頭に移動します。IO#lineno は 0 になります。

seek(offset[, whence])

ファイルポインタを offset だけ移動させます。whence の 値が IO::SEEK_SET の時にはファイルの先頭から、 IO::SEEK_CUR の時には現在のファイルポインタから、 IO::SEEK_END の時にはEOFから offset バイトだけ移動しま す。whence の省略値は IO::SEEK_SET です。

offset 位置への移動が成功すれば 0 を返します。 失敗した場合は例外 Errno::EXXX が発生します。

stat

ファイルのステータスを含む File::Stat オブジェクトを生成して 返します。

ステータスの読み込みに失敗した場合は例外 Errno::EXXX が発生 します。

File#lstat, File.stat, File.lstat も参照してください。

sync

現在の出力同期モードを真偽値で返します。同期モードが真の時は 出力関数の呼出毎にバッファがフラッシュされます。

sync=newstate

出力同期モードを設定します。 newstate が真なら同期モード、偽なら非同期モードになります。 newstate を返します。

sysread(length)

read(2) を用いて入力を行ない、入力されたデータを 含む文字列を返します。ファイルの終りに到達した時には例外 EOFError を発生させます。stdio を経由しないので getsgetceof? などと混用すると思わぬ動作 をすることがあります。

データの読み込みに失敗した場合は例外 Errno::EXXX が発生しま す。

sysseek(offset[, whence]) ((<ruby 1.7 feature>))

lseek(2) と同じです。seek では、 sysread, syswrite と併用すると正しく動作しないの で代わりにこのメソッドを使います。バッファリングされた IO に対して 実行すると例外 IOError が発生します。*2

引数は IO#seek と同じです。

offset 位置への移動が成功すれば移動した位置(ファイル先頭から の位置)を返します。移動に失敗した場合は例外 Errno::EXXX が発 生します。

syswrite(string)

write(2) を用いて string を出力します。 string が文字列でなければ to_s による文字列化を試みます。 stdio を経由しないので他の出力メソッドと混用すると思わぬ動作 をすることがあります。

実際に出力できたバイト数を返します。出力に失敗した場合は例外 Errno::EXXX が発生します。

to_io

self を返します。

ungetc(char)

char を読み戻します。2バイト以上の読み戻しは保証されません。

nil を返します。

write(str)

IOポートに対して str を出力します。str が文字列でなけ れば to_s による文字列化を試みます。

IO#syswrite を除く全ての出力メソッドは、最終的に "write" という名のメソッドを呼び出すので、このメソッドを置き換える ことで出力関数の挙動を変更することができます。 *3

実際に出力できたバイト数を返します。出力に失敗した場合は例外 Errno::EXXX が発生します。

定数

SEEK_CUR
SEEK_END
SEEK_SET

IO#seek を参照してください。


*1あらい 2002-08-03 たぶん
*22002-03-30 あらい: 不正確。もう少し詳細に
*3あらい 2002-03-10: 現在の実装では、このことはputc, IO#putc に対しては適用されません。ruby-dev:16305[外部]