【C/C++】 streamクラスのeofメンバ
以下の記事でstreamクラスのeofの扱いが難しいという記事を書いたんやけど、まぁこれやったらと許容できる方法を考えたので載せておこう。
【C/C++】ifstreamのeofメンバ関数(違和感のある挙動)
ちなみに以前はifstreamについて書いたんやけど、調べてみるとstream系のeofは全て同じ実装みたい。
つまり、実際に最終要素にアクセスした後でないと、正確なeofを検出できないと。
そこで、以下のようにすると、うまく動きます。
ん〜、読み出し部分が2行あって気持ち悪いけど、一応これやったらちゃんと対応できてると思うんよね。
istringstream s(buff);
string line;s >> line; <-- ミソ
while( !s.eof() ) {
〜何らかの処理〜
s >> line;
}
単純にwhileループをeofメンバで終了判定するのやけど、その時にwhile文の直前に一回読み出しを行ってしまおうと。
要素数が0の場合: while文に入らず終了(処理されない)
要素数が1の場合: while文に入り処理が1回実行。次のループ条件が偽になりループから抜ける。
要素数が2の場合: 上記の繰り返し
という事で、うまく行きそうですな。
ん〜、なるほど。こういう思想で設計されているんやね。