« 【Linux Tips】 テキストファイルの一括置き換え/ファイル名の一括置き換え | トップページ | 【VirtualBox】 VirtualBoxのバージョンアップ (2.1 -> 3.1.2) »

【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の場合:  上記の繰り返し

という事で、うまく行きそうですな。
ん〜、なるほど。こういう思想で設計されているんやね。

« 【Linux Tips】 テキストファイルの一括置き換え/ファイル名の一括置き換え | トップページ | 【VirtualBox】 VirtualBoxのバージョンアップ (2.1 -> 3.1.2) »

C/C++」カテゴリの記事

コメント

とても参考になりました。ありがとうございます!

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 【C/C++】 streamクラスのeofメンバ:

« 【Linux Tips】 テキストファイルの一括置き換え/ファイル名の一括置き換え | トップページ | 【VirtualBox】 VirtualBoxのバージョンアップ (2.1 -> 3.1.2) »