From: Wakou Aoyama Date: 1999-07-23T11:57:28+09:00 Subject: [ruby-dev:7405] Re: Ruby 1.3.5 青山です。 Fri, Jul 23, 1999 at 10:14:06AM +0900 において WATANABE Tetsuya さん曰く: > 話の前提として、この辺に気が付いていなかったの > ですね。読んでいて「あれ?」って思っていました。 そうだったんですよ。お恥ずかしい。というか、Ruby の方がメインなので、C の方はほとんど見ていないんですよね。 > どういうものが、使いやすいでしょうか? > > STDIO を使っている範囲内で、現実的なものという > のは? (あまり細かく考えていないのですが) C で > fread(3) を使うイメージを持っている人は楽です > が、そういう前提がない人でも引っかかりにくいも > のがいいですね(って、具体的に書けないのですが)。 結局、まつもとさんが最初に採用されていた、EOF で nil というのが使いや すくて良さそうに思えます。while s = io.read(n); end という使い方もでき ますしね。 今回の話のはじまりは、0 バイトのファイルの最初の 0 バイトの読み込み、 すなわち、0 バイトのファイルに対する read(0) でした。 つまり、fread(3) は EOF とは無関係ですから、EOF の判定は別に行う必要が あり、この判定を feof(3) で行っていれば単純だったのですが、自前で行っ ていた事により、0 バイトの読み込みは無条件に EOF となっていた事が発端 です。 read(0) が nil という挙動ならば、read() の後の read() もやはり nil で はないか、いや、read() の後の read() は "" で、read(0) を "" にすべき だ。と。そんな展開です。 話がややこしくなってしまったのは、正に fread(3) の挙動に気が付かなかっ た為なのですが、その事が判明した現在では、話の中心は、IO#read によって fread(3) に拡張を行っている、EOF で nil の扱い、すなわち、Ruby における EOF とはどうあるべきかという事になっています。 また長くなってしまいましたが、「read は EOF で nil を返す」という Ruby の fread(3) の拡張については扱いやすくて良いと思われますので、現在のメ インはその「EOF は Ruby ではどうあるべきか」という事だと思います。 feof(3) をそのままか、それとも、現在のように次の1バイトが読み込めない 場合とするか、ですね。 -- 青山 和光 Wakou Aoyama