けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :2861 ] the message: "[ruby-dev:2861] Re: [BUG] IO#eof? 
when Thread using ", on Jun/12 12:08(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|read(2)について調べたところ, non block io時以外ではreturn値が0になるの
>|は, EOFのときだけ見たいです. block io時は必ずblockするとなっています. 
>|
>|ということで, freadも, EOFが来る以外ではsize分読み込むようになっていな
>|いのかしら?
>
>EOF以外で0を返すことはないと思いますが,lenより短い長さを返
>すことはあると思いますよ.man freadすればわかりますが.

こっちのマニュアル(同じものと思いますが)では, 

   If an error occurs, or the end-of-file is reached, the return
       value is a short item count (or zero).

となっていますので, lenより身近いときは, errorかEOFですので, その時は,

       fread does not distinguish between end-of-file and  error,
       and  callers  must  use feof(3) and ferror(3) to determine
       which occurred.

をやって下されば, まさに望んでいるものになりそうです.


>|# それは, stdioがnon blocking ioに対応している場合ですね. 実際はどうな
>|# んだろう?
>ええ,stdio次第だと思います.もっともsysread/syswriteを使え
>ば関係ないですが.

まあ, それもいえますね.

>|readline/readcharに相当する IO#readが欲しいですね. で, そのメソッドは
>|サイズ分を読み込む前にEOFが来たら例外を出すというのはどうでしょう?
>
>そのメソッドはサイズ分を読み込む(か例外を返す)ことを保証する
>わけですね.では,以下のことを検討する必要がありますね.
>
>  * 現在のreadの仕様を使えばrubyで簡単に定義できるが,わざわ
>    ざ組み込みメソッドにする必要があるか

1.
  getc/readchar
  gets/readline

の対象性からあった方が良い.

2. read(n)の時に毎回サイズをチェックしなければ, 正しいプログラムになら
   ないのはめんどくさいことが多い.

   *私なら*ですが, readよりも新readを絶対使いますね.

3. 問題点

readlineと新readって若干動作が違うんですね. readlineは読み込中にEOFが
来るとそれまで読んでいたものを返しますが, 新readはそのサイズに満たなけ
れば, 例外ですので...

でも, 両方の使い方からいって, 総方ともそうなっている方が良いとは思いま
すが...

>  * もし,必要があったとして,名前をどうするか

ここが迷うところですね. 

  read/readn
  read/readchars
  read/readstring
  read/reads
  read/readlength
  read/readnlength

ぐらいかなあ... あと, 互換性を無視すれば, 今のreadを

  getn

にして, 例外版を read にするというのも考えられますが... こっちの方が, 
他の命名規則とあってはいますが...

  getn/read

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---