From: Wakou Aoyama Date: 1999-07-23T01:31:46+09:00 Subject: [ruby-dev:7397] Re: Ruby 1.3.5 青山です。 Fri, Jul 23, 1999 at 12:03:35AM +0900 において Wakou Aoyama さん曰く: > read() や read(n) はエラーをトラップしてしまっているので表面化しません > が、上記の「読み込み終了」にあたる部分は、本当は EOFError が発生した場 > 合です。 > > $ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size > p io.eof? > p io.sysread(1024) > p io.eof? > ' > 0 > false > /tmp/rbXBKqfG:3:in `sysread': End of file reached (EOFError) > from /tmp/rbXBKqfG:3 失礼しました。これは例が悪かったです。IO#sysread は read を使っていて、 IO#read は fread を使っていました。 そして、fread は EOF を検知しないようです。feof を使う必要があると書い てありますね。man fread という事は、 > > (1) "", "" > > (2) "", nil > > > > のどっちにするかですね。つまり > > > > (1a) read() は read(n) と全く違うものと思う > > (2a) read() は read(n) と類似と思う > > > > の違いです。私は (1a) を推しています。0バイトファイルに対して > > 1回目の read() が "" であるのに read(0) は nil なので、read() > > と read(n) が類似とはいえないから、というのが一つの論拠です。 実は read(n) も (1) なんですね。 そして、 > 単に EOF で nil を返します。ではなく、1バイトも得られず EOFError が発 > 生した場合には nil を返します。とか。実装もこうなっているわけですし。 これも間違いで、より単純に1バイトも得られなかった場合には nil なんで すね。EOFError とは無関係。 すると、read(n) も含めて (1)、(2) 共に選択肢としてあり得るという事のよ うです。 -- 青山 和光 Wakou Aoyama