From: WATANABE Hirofumi Date: 2002-08-27T16:50:21+09:00 Subject: [ruby-dev:18092] Re: IO.read returns nil with empty file わたなべです。 Yukihiro Matsumoto writes: > |ふと、空ファイルに対して IO.read を使って nil が返ってきて驚きました。 > | > |% ruby -e 'p IO.read("/dev/null")' > |nil > | > |"" のほうがいいと思うんですが、どうでしょう? > > なんか理由があったような気がしますが、ログを調べてみないと。 > 原さんからの指摘だったように思うんだけど。 そういえば原先生のrequestはEOFだったらnilを返すだったような。 だから2回目以降はnilを返す。 % ruby-1.6.7 -e 'open("zero"){|fh|p fh.read;p fh.read}' "" nil 1.6.7を真似するとこんな感じかな。 Index: io.c =================================================================== RCS file: /src/ruby/io.c,v retrieving revision 1.148 diff -u -1 -p -r1.148 io.c --- io.c 2002/08/21 15:47:54 1.148 +++ io.c 2002/08/27 07:42:12 @@ -645,2 +645,3 @@ read_all(fptr, siz) long n; + long pos = 0; @@ -650,5 +651,6 @@ read_all(fptr, siz) str = rb_tainted_str_new(0, siz); + pos = ftell(fptr->f); for (;;) { n = rb_io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f); - if (n == 0 && bytes == 0) { + if (pos > 0 && n == 0 && bytes == 0) { if (feof(fptr->f)) return Qnil;