iostream と streambuf

iostreamの例外を制御するには exceptions(iostate except) を呼び出せば よいようである。

iostate は

  • badbit
  • eofbit
  • failbit

がある。これに加え

  • goodbit = iostate(0)

が定義されている。

bad()とfail()の違いは微妙とされている。それまでのstreamは壊れて いないが動作できなくなったのがfail()で、streamそのものが壊れて いる場合はbad()であるとされている。例えば eof を超えて読み出そう とした場合は fail() だし、読み出し長さ(gcount())が 0 の場合も fail() で扱われている。

tcp connection で考えてみよう。

  • ::soket() に失敗したら bad() だろう。
  • ::gethostbyname() などに失敗したら、これも bad() だろう。
  • ::connect() に失敗したら、、これは判断がむつかしい。

例えば connect()に失敗した時は、::gethostbyname() で address 解決 できているとすると、一番考えられるのは相手ポートが開いてないか、 接続拒否だろうが、この場合相手が存在しているので、bad() ではなく fail() と考えるべきかも知れない。

file を stream化した fstream では open できなかった場合は、 fail() で扱われてるので、その意味では ::connect() の失敗は fail() が妥当かも知れない。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-05-26 (金) 20:35:20